2011-11-16 80 views
1

如何在表中插入一個數字,僅當表中尚未包含該數字時才使用?只有在表中不存在某個值時才插入SQL?

我正在尋找特定的SQL代碼,不確定如何處理這個問題。嘗試了幾件事,沒有任何工作。

編輯

表看起來是這樣的:

PK ID Value 
1  4  500 
2  9  3 

所以,如果我想INSERT (ID, Value) VALUES (4,100)它不應該試圖做到這一點!

+0

不能告訴你,除非你展示什麼樣的表看起來像 – Hogan

+2

基本上是一個改編的版本的http://stackoverflow.com/questions/8156931/why-is-my-sql-failing-ora-00933-sql-命令未正確結束 –

回答

3

嘗試MERGE語句:

MERGE INTO tbl USING 
    (SELECT 4 id, 100 value FROM dual) data 
ON (data.id = tbl.id) 
WHEN NOT MATCHED THEN 
    INSERT (id, value) VALUES (data.id, data.value) 
+0

ORA-00969:缺少關鍵字 – antonpug

+0

我從內存中編寫了它,我現在無法訪問oracle db。嘗試將ON條件更改爲[[]] ON(data.id = tbl.id) [...]。這是我現在唯一可能犯的錯誤。 您還可以查看[此鏈接](http://psoug.org/reference/merge.html)以獲取更多示例。 – Krzysztof

+0

是的,我認爲問題在於你必須在ON條件下有()'...我已經編輯了答案,但是由於我沒有足夠的代表,所以必須對其進行審查。 :) – bhamby

0
INSERT INTO YOUR_TABLE (YOUR_FIELD) 
SELECT '1' FROM YOUR_TABLE YT WHERE YT.YOUR_FIELD <> '1' LIMIT 1 

當然,這 '1' 將是你的電話號碼或您的變量。 您可以使用INSERT + SELECT解決此問題。

+0

不起作用 - 仍然插入,但數字已經在那裏。 – antonpug

+0

只有在表格中有一行時,它纔有效。 'INSERT INTO tbl(ID,Value)SELECT 4,100 WHERE NOT EXISTS(SELECT 1 FROM tbl WHERE ID = 4)'應該可以工作。 – Krzysztof

5

如果ID應該是唯一的,那麼應該在表上定義唯一的約束。如果您嘗試插入已經存在

ALTER TABLE table_name 
    ADD CONSTRAINT uk_id UNIQUE(id); 

您可以捕獲錯誤並做了什麼價值,如果試圖插入重複你想從忽略key--任何會引發錯誤錯誤日誌和重新提高例外養自定義異常

BEGIN 
    INSERT INTO table_name(id, value) 
    VALUES(4, 100); 
EXCEPTION 
    WHEN dup_val_on_index 
    THEN 
    <<do something>> 
END; 

您也可以編寫代碼INSERT以便讓它能夠插入0行(你還是想無論是從數據模型的角度來看到位的唯一約束和因爲它爲優化程序提供了更多信息並可能使未來的查詢效率更高)

INSERT INTO table_name(id, value) 
    SELECT 4, 100 
    FROM dual 
    WHERE NOT EXISTS( 
    SELECT 1 
     FROM table_name 
    WHERE id = 4) 

或者您也可以編碼MERGE,以便將VALUE列從500更新爲100,而不是插入新行。

相關問題