Mysql
在重複鍵上什麼都不做
我正在使用帶有 PtokaX API 的 LuaSQL 插入下表。
CREATE TABLE `requests` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `ctg` VARCHAR(15) NOT NULL, `msg` VARCHAR(250) NOT NULL, `nick` VARCHAR(32) NOT NULL, `filled` ENUM('Y','N') NOT NULL DEFAULT 'N', `dated` DATETIME NOT NULL, `filldate` DATETIME NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE INDEX `nick_msg` (`nick`, `msg`), UNIQUE INDEX `ctg_msg` (`ctg`, `msg`) ) COMMENT='Requests from users in any of the categories.' COLLATE='utf8_general_ci' ENGINE=MyISAM;
現在,我的問題是,當使用者(由 表示
nick
)嘗試再次插入相同的請求時,UNIQUE
會檢查索引並且腳本返回 false。這會導致我的腳本失敗,我必須重新啟動腳本。有什麼我可以在
INSERT ... ON DUPLICATE KEY
命令中做的事情,以便它什麼都不做,或者至少在 的情況下不返回錯誤**DUPLICATE KEY
**?否則,我將不得不
dated
用新DATETIME
值更新我的欄位。
三種方式。
IGNORE
重複錯誤(但不要使用它,請參閱最後的註釋):INSERT IGNORE ... ; -- without ON DUPLICATE KEY
或者當有重複時嘗試進行冗餘更新:
INSERT ... ON DUPLICATE KEY UPDATE id = id ;
或在插入之前檢查重複項:
INSERT INTO requests (id, ctg, msg, nick, filled, dated, filldate) SELECT NULL, 'urgent', 'Help!', 'Hermione', 'Y', NOW(), NOW() FROM dual WHERE NOT EXISTS ( SELECT * FROM requests WHERE (nick, msg) = ('Hermione', 'Help!') ) AND NOT EXISTS ( SELECT * FROM requests WHERE (ctg, msg) = ('urgent', 'Help!') ) ;
第三種方式與前兩種方式的不同之處在於,當有重複時,
id
不會增加。使用INSERT IGNORE
andINSERT ... ON DUPLICATE KEY
,它將自動遞增,並且由於插入不會完成,因此您將在id
.我還應該補充一點,您的腳本應該始終檢查錯誤,並且在有錯誤時不會失敗。由於各種原因,任何查詢或語句都可能偶爾失敗並返回錯誤。上面的技巧只會讓你避免一種錯誤。
*注意:
INSERT IGNORE
將忽略所有與插入相關的錯誤,甚至不會違反空約束,所以最好避免它。