Mysql

在重複鍵上什麼都不做

  • December 16, 2020

我正在使用帶有 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 IGNOREand INSERT ... ON DUPLICATE KEY,它將自動遞增,並且由於插入不會完成,因此您將在id.

我還應該補充一點,您的腳本應該始終檢查錯誤,並且在有錯誤時不會失敗。由於各種原因,任何查詢或語句都可能偶爾失敗並返回錯誤。上面的技巧只會讓你避免一種錯誤。

*注意:INSERT IGNORE將忽略所有與插入相關的錯誤,甚至不會違反空約束,所以最好避免它。

引用自:https://dba.stackexchange.com/questions/38817