MySQL中的`REPLACE`和`INSERT ... ON DUPLICATE KEY UPDATE'有什么实际区别?

Iva*_*van 67 mysql sql replace insert

我需要的是使用特定键设置记录的所有字段的值(键实际上是复合键),如果没有带有这样键的记录则插入记录.

REPLACE似乎意味着要做的工作,但同时它的手册页建议 INSERT ... ON DUPLICATE KEY UPDATE.

我应该更好地选择什么?为什么?

REPLACE我想到的唯一"副作用" 是它会增加自动增量值(幸运的是我不使用任何),而INSERT ... ON DUPLICATE KEY UPDATE可能不会.要记住的其他实际差异是什么?在哪些特定情况下可以REPLACE优先考虑INSERT ... ON DUPLICATE KEY UPDATE,反之亦然?

Mar*_*ers 100

REPLACE在内部执行删除,然后执行插入.如果您有指向该行的外键约束,这可能会导致问题.在这种情况下REPLACE可能会失败或更糟:如果您的外键设置为级联删除,REPLACE将导致其他表中的行被删除.即使在REPLACE操作之前和之后都满足约束,也会发生这种情况.

使用INSERT ... ON DUPLICATE KEY UPDATE避免了这个问题,因此是首选.

  • 我已经做了相当多的研究,据我所知,没有普遍的理由使用REPLACE而不是INSERT ...在重复键更新上。从本质上讲,这是一项旧功能。除非出于某些特殊原因,您的代码依赖于要删除和重新添加的行以及对索引和自动增量值的相关影响,否则似乎没有任何理由使用它。 (2认同)
  • 在`REPLACE` 上,如果执行`DELETE` 和`INSERT`,将更新你的PK 自动递增值。这正是我想要的。我不希望消费者在同一个 PK 下找到记录,所以他们没有得到任何行。当我希望他们找到它(实际更新)时,我使用 `UPDATE` (2认同)

kat*_*rix 43

为了回答性能方面的问题,我使用这两种方法进行了测试

替换为涉及:1.
尝试在表上插入
2.如果1失败,删除行并插入新行

插入重复键更新涉及:1.
尝试在表
2 上插入.如果1失败,则更新行

如果涉及的所有步骤都是插入,性能应该没有区别.速度必须取决于所涉及的更新次数.最糟糕的情况是所有陈述都是更新

我在InnoDB表上尝试了两个语句,涉及62,510个条目(仅更新).在坎帕速度上:
替换为:77.411秒
在重复键更新时插入:2.446秒

Insert on Duplicate Key update is almost 32 times faster.
Run Code Online (Sandbox Code Playgroud)

表大小:亚马逊m3.medium上有12列的1,249,250行


And*_*Mao 8

当使用REPLACE而不是INSERT ... ON DUPLICATE KEY UPDATE,当有多个查询快速到达给定密钥时,我有时会观察到密钥锁定或死锁问题.后者的原子性(除了不导致级联删除)更有理由使用它.