在重复键上什么都不做

hjp*_*r92 17 mysql insert duplication update

我正在使用带有 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;
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是,当用户(由 表示nick)尝试再次插入相同的请求时,UNIQUE会检查索引并且脚本返回 false。这会导致我的脚本失败,我必须重新启动脚本。

有什么我可以在INSERT ... ON DUPLICATE KEY命令中做的事情,以便它什么都不做,或者至少不会在以下情况下返回错误DUPLICATE KEY

否则,我将不得不dated使用新DATETIME值更新我的字段。

ype*_*eᵀᴹ 25

三种方式。要么IGNORE重复错误(但不要使用它,请参阅最后的注释):

INSERT IGNORE 
  ... ;                   -- without ON DUPLICATE KEY
Run Code Online (Sandbox Code Playgroud)

或者在有重复时尝试进行冗余更新:

INSERT 
  ... 
ON DUPLICATE KEY UPDATE
  id = id ;
Run Code Online (Sandbox Code Playgroud)

或在插入之前检查重复项:

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!') ) ;
Run Code Online (Sandbox Code Playgroud)

第三种方式和前两种方式的区别在于,当有重复时,id不会递增。使用INSERT IGNOREand INSERT ... ON DUPLICATE KEY,它将自动递增,并且由于插入不会完成,您将在id.

我还应该补充一点,无论如何,您的脚本应该始终检查错误,并且在出现错误时不会失败。由于各种原因,任何查询或语句都可能会失败并偶尔返回错误。上面的技巧只会让你免于一种错误。

*注意:INSERT IGNORE会忽略所有与插入相关的错误,甚至不违反空约束,所以最好避免它。