【问题标题】:On duplicate key ignore? [duplicate]在重复键忽略? [复制]
【发布时间】:2011-01-22 22:25:54
【问题描述】:

我正在尝试完成这个查询;我的标签字段设置为唯一,我只是希望数据库忽略任何重复的标签。

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*'

【问题讨论】:

标签: mysql


【解决方案1】:

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

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

在重复键上产生:

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

【讨论】:

  • 正确,很好的答案。插入忽略是个坏消息!
  • @Boundless 这确实取决于,例如,我有一个表,其中包含数据库中特定数据条目的类别。在对这些类别进行更改时,我会使用包含所有这些类别的 INSERT IGNORE,而不是通过测试来查看这些类别之间的差异。
  • 警告:ON DUPLICATE KEY UPDATE foo=foo; 会增加你遇到死锁的机会,因为它会额外持有你的索引的 Next-Key 锁。更多:dev.mysql.com/doc/refman/5.7/en/…
  • @DzmitryLazerka 你有关于这方面的更多信息吗?它是否仍然相关?我个人从未在这种情况下经历过死锁,我怀疑当“0行受影响”时它会导致死锁。
  • @CodeCommander 是的,我们在 Google Cloud SQL 上遇到了死锁。但是您不会仅仅因为使用 ON DUPLICATE KEY UPDATE 查询而导致死锁,您还需要一些其他“合作”查询来获得死锁。
【解决方案2】:

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

edit好像他们把它重命名为REPLACE

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

【讨论】:

  • 我需要你详细说明一下吗?
  • Replace 将在替换之前删除冲突的行。如果你有外键,指向被删除的行你就有麻烦了。
  • 而且您必须考虑潜在的性能损失。而不是一次读取和潜在的一次写入您可以读取,写入(删除行),写入(插入行)和写入(更新索引),因此 1x 读取和 3x 写入(充其量,如果只更新一个索引)..
  • 很高兴了解 REPLACE。然而,使用 REPLACE 的另一个问题是,如果该行有一个自动递增的主键,并且 REPLACE 查询运行多次,则每次运行查询时主键的增量都会增加。
  • 我强烈建议不惜一切代价避免使用此命令。性能方面,它完全糟透了。不知道为什么他们甚至让这个东西成为一种选择。删除命令占用资源,然后您必须编辑所有索引,唯一的索引占用时间最长。我有一段时间使用它的代码,当我迁移到 Insert 时......在重复键更新时 - 性能提高了。此外,这个命令最终会过早地烧掉你所有的自动增量主键。
猜你喜欢
  • 1970-01-01
  • 2015-10-15
  • 2012-12-06
  • 2018-06-01
  • 2015-05-25
  • 1970-01-01
  • 2012-08-04
  • 2011-08-05
  • 1970-01-01
相关资源
最近更新 更多