2012-09-03 49 views
1

這個問題已被問及答覆了很多次,但我仍然難倒了。我想要的所有 如果列中尚未存在值,則運行插入語句。請注意,此列中的值不構成主鍵,因此replaceupdate方法將不起作用。使用EXISTS插入到MySQL 5.x中

word_id (PK, auto-complete) | word | timestamp (autocomplete)
1--sinecure--25th March
2--demotic--3rd April
3--atavism--5th May

之前增加一個詞來這個表,我首先要檢查它已經不存在。考慮到這一點,這個例子應該保持表格不變。

INSERT INTO word_table(word) VALUES "sinecure"
WHERE NOT EXISTS (SELECT word FROM word_table WHERE word LIKE "sinecure")

當然,表此查詢後是不變的,但僅僅是因爲它拋出一個錯誤。 這不是我嘗試過的唯一語法,但它是我看過的各種 論壇/教程中最經常提倡的語法。我也有過各種黑客攻擊,例如使用變量來存儲由EXISTS語句產生的bool值,但無濟於事。

回答

2

您可以使用此:

INSERT INTO word_table (word) 
SELECT 'sinecure' 
FROM dual 
WHERE NOT EXISTS (SELECT word FROM word_table WHERE word LIKE 'sinecure') ; 

如果這種行爲在任何時候都想要的,不是偶爾,添加唯一約束的word列,正如其他建議。那麼你可以使用一個簡單的插入,如果字是重複的,這將引發錯誤:

INSERT INTO word_table (word) 
VALUES ('sinecure') ; 

INSERT IGNORE將忽略錯誤:

INSERT IGNORE INTO word_table (word) 
VALUES ('sinecure') ; 
+0

+1這是把戲來克服這個*限制*在MySQL中。 – Augusto

+0

@Augusto這裏沒有MySQL限制。 INSERT INTO TABLE VALUES(...)WHERE ...'在所有SQL方言中的語法無效。 –

+0

選擇了獨特的限制路線。不完美,因爲它排除了列表中同形異義詞的存在,但它們並不多,所以我應該逃避它。 –

2

如果我的記憶功能正確,則無法對要更新的表執行嵌套查詢。你可以做的是運行選擇,如果你沒有得到任何結果,插入數據。

否則,您可能已在word列上有索引。使該索引唯一併且您的問題將被解決,因爲如果該單詞已經存在,數據庫將返回錯誤。這個詞不會是你的主鍵,但它實際上是一個備用(唯一)鍵。

0

該字段應該有一個唯一的鍵約束。只需創建索引,你就可以擁有它。