重复键忽略?

Goo*_*bye 152 mysql

我正在尝试完成此查询; 我的标记字段设置为UNIQUE,我只是希望数据库忽略任何重复的标记.

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

甚至这是可以接受的

INSERT INTO table_tags (tag) VALUES ('tag_a'),('tab_b'),('tag_c')
ON DUPLICATE KEY UPDATE '*the offending tag and carry on*'
Run Code Online (Sandbox Code Playgroud)

小智 335

建议不要使用INSERT IGNORE,因为它忽略了所有错误(即它是一个草率的全局忽略).相反,因为在您的示例中tag是唯一键,请使用:

INSERT INTO table_tags (tag) VALUES ('tag_a'),('tab_b'),('tag_c') ON DUPLICATE KEY UPDATE tag=tag;
Run Code Online (Sandbox Code Playgroud)

在重复键上产生:

查询正常,0行受影响(0.07秒)

  • 对,好的答案.INSERT IGNORE是坏消息! (7认同)
  • @Boundless实际上确实取决于,例如,我有一个表,其中包含数据库中特定数据条目的类别。关于这些类别的更改,我将使用包含所有这些类别的INSERT IGNORE,而不是进行测试以查看这些类别之间的差异。 (2认同)
  • 警告:`ON DUPLICATE KEY UPDATE foo = foo;`将增加死锁的机会,因为它还会在索引上保持Next-Key锁定。更多:https://dev.mysql.com/doc/refman/5.7/zh-CN/innodb-locking.html#innodb-next-key-locks (2认同)

Byr*_*ock 16

Mysql有这个方便的UPDATE INTO命令;)

编辑看起来他们将其重命名为REPLACE

REPLACE与INSERT的工作方式完全相同,只是如果表中的旧行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前删除旧行

  • 替换将在替换之前删除冲突的行.如果您有外键,指向已删除的行您将遇到麻烦. (61认同)
  • 而且你必须考虑潜在的性能影响.而不是一个读取和一个潜在的写入您获得读取,写入(删除行),写入(插入行)和写入(更新索引),因此1x读取和3x写入(最好,如果只更新一个索引)... (7认同)
  • 我强烈建议您不惜一切代价避免使用此命令。性能方面,它完全糟透了。不知道为什么他们甚至将此东西作为选项。delete命令占用资源,然后您必须编辑所有索引,唯一索引占用的时间最长。我有一段时间使用此代码,当我迁移到插入时...在重复键更新时-性能提高了。同样,此命令最终将过早烧毁所有自动增量主键。 (2认同)