在MySQL中`REPLACE`和`INSERT ... ON DUPLICATE KEY UPDATE`之间的实际区别是什么?
我需要的是设置一个记录的所有字段的值与一个特定的键(键实际上是复合),插入记录如果没有这样的记录的记录呢。在MySQL中`REPLACE`和`INSERT ... ON DUPLICATE KEY UPDATE`之间的实际区别是什么?
REPLACE
似乎是为了完成这项工作,但同时它的手册页建议 INSERT ... ON DUPLICATE KEY UPDATE
。
他们中的哪些人应该更好地选择,为什么?
我想到的REPLACE
唯一的“副作用”是它会增加自动增量值(幸运的是我没有使用任何值),而INSERT ... ON DUPLICATE KEY UPDATE
可能不会。需要考虑哪些其他实际差异?在什么特定情况下,REPLACE
优于INSERT ... ON DUPLICATE KEY UPDATE
,反之亦然?
REPLACE
内部执行删除,然后插入。如果您有指向该行的外键约束,则会导致问题。在这种情况下,REPLACE
可能会失败或更糟:如果您的外键被设置为级联删除,则REPLACE
将导致删除其他表中的行。即使约束在REPLACE
操作之前和之后都满足,也会发生这种情况。使用INSERT ... ON DUPLICATE KEY UPDATE
可以避免这个问题,因此是首选。
+1这很有启发作用!我被这个咬了,从来没有想过它。 – 2012-02-06 23:37:22
很好的答案,但在我的实际案例中,这个问题不会得到满足。碰撞的可能性可以被认为是50/50。我应该选择什么?而“INSERT ... ON DUPLICATE KEY UPDATE”看起来相当“好”,那么在什么特定情况下,“REPLACE”是更好的选择? – Ivan 2012-02-06 23:50:42
我已经做了相当多的研究,并且据我所知,使用REPLACE而不是INSERT ... ON DUPLICATE KEY UPDATE没有共同的理由。它本质上是一项遗留功能。除非你的代码依赖于被删除和重新添加的行,以及索引和自动递增值的相关效果,有一些特殊原因,否则似乎没有任何理由使用它。 – 2013-05-17 05:46:28
替换似乎它在密钥已经存在的情况下执行两个操作。也许这意味着两者之间存在速度差异?
(INSERT)一个更新VS一个删除+一个插件(替换)
编辑:我的暗示,即更换速度可能会变慢实际上是完全错误的。那么,根据这个博客张贴反正... http://www.tokutek.com/2010/07/why-insert-on-duplicate-key-update-may-be-slow-by-incurring-disk-seeks/
当使用REPLACE
代替INSERT ... ON DUPLICATE KEY UPDATE
,我有时观察钥匙锁或死锁问题时,多次查询一个给定键快速到达。后者的原子性(除了不会导致级联删除之外)是使用它的更多理由。
在哪些特定情况下,REPLACE可以优先于INSERT ... ON DUPLICATE KEY UPDATE,反之亦然?
我刚刚发现,在表与联合存储引擎的情况下INSERT...ON DUPLICATE KEY UPDATE
语句接受了艰辛的道路,但不能(与错误1022:无法写入;复制表键.. )如果发生重复键违例 - 请参见MySQL参考手册的this page上的相应项目符号。
幸运的是,我能够使用REPLACE
而不是INSERT...ON DUPLICATE KEY UPDATE
我插入后触发器内实现复制更改为联合表格所期望的结果。
如果你没有列出所有的列,我认为REPLACE
将重置任何未提及的列及其在被替换的行中的默认值。 ON DUPLICATE KEY UPDATE
会使未提及的列保持不变。
要回答这个问题,在性能方面,我用做了一个测试两种方法
更换成包括:
1.Try插在桌子上
2.如果1失败,删除一行并插入新行
插入在重复键更新包括:
1.Try上表
2.如果1失败,更新行
插入 如果涉及的所有步骤都是插入,则应该没有性能差异。速度取决于涉及的更新数量。最糟糕的情况是,当所有的陈述更新
我已经尝试了两个涉及62,510条目(只更新)的InnoDB表上的语句。在camparing速度:
更换成:77.411秒
插入在重复键更新:2.446秒
Insert on Duplicate Key update is almost 32 times faster.
台面尺寸:1249250排,12列在Amazon m3.medium
酷统计,你尝试'插入重复键替换'?它慢吗? – radtek 2017-07-28 15:11:42
“这有可能在存在重复键错误的情况下,存储引擎可能会执行REPLACE作为更新而不是删除加插入,但语义相同。“
INSERT ...对重复密钥更新事实上确实也增加了自动增量计数器。不是为了更新记录,而是为了插入下一条记录。因此,如果最高ID为10,并且您做了重复插入,然后插入新的唯一值,那么该行的ID将变为12. – marlar 2015-09-18 21:31:52