2010-03-02 226 views
118

夥計們我試圖完成這個查詢 - >我的標記字段設置爲UNIQUE,我只想讓數據庫忽略任何重複的標記。重複鍵忽略?

INSERT INTO table_tags (tag) VALUES ('tag_a'),('tab_b'),('tag_c') 
ON DUPLICATE KEY IGNORE '*the offending tag and carry on*' 

,甚至這是可以接受的

INSERT INTO table_tags (tag) VALUES ('tag_a'),('tab_b'),('tag_c') 
ON DUPLICATE KEY UPDATE '*the offending tag and carry on*' 
+0

參見:[「INSERT IGNORE」vs「INSERT ... ON DUPLICATE KEY UPDATE」](http://stackoverflow.com/q/548541/1402846)。 – Pang 2013-04-07 11:17:18

回答

270

不會使用建議之前被刪除插入IGNORE,因爲它忽略所有錯誤(即它是一個馬虎的全局忽略)。 相反,因爲在你的例子tag是唯一鍵,使用:

INSERT INTO table_tags (tag) VALUES ('tag_a'),('tab_b'),('tag_c') ON DUPLICATE KEY UPDATE tag=tag; 

上重複鍵生成:

查詢OK,0行受到影響(0.07秒)

+3

對,很好的回答。插入IGNORE是個壞消息! – Boundless 2012-09-11 20:36:20

+1

@Derrick你會考慮爲未來的搜索者改變這個接受的答案嗎?對於那些提到這個問題的人來說,最好有更安全的解決方案。 – damianb 2013-03-14 20:02:20

+1

@Boundless它確實取決於,例如,我有一個表包含數據庫中特定數據條目的類別。在對這些類別進行更改時,我會使用包含所有這些類別的INSERT IGNORE,而不是測試來查看這些類別之間的差異。 – Jay 2013-09-25 16:35:36

11

Mysql已經這個方便UPDATE INTO命令;)

編輯看起來他們給它改名,以取代

更換工程完全像INSERT, 除了th在如果舊行的表 具有相同的值作爲一個 主鍵或唯一索引的新行中, 舊行的新行 插入

+0

Dood我會需要你詳細說明那個? – 2010-03-02 21:19:30

+0

感謝您的幫助和時間,Ivan Nevostruev解決方案似乎爲我做了竅門 – 2010-03-02 21:27:00

+44

替換將替換之前刪除衝突的行。如果您有外鍵,指向您遇到麻煩的已刪除行。 – nakhli 2012-08-07 20:53:46