我需要的是设置具有特定键的记录的所有字段的值(键实际上是复合的),如果还没有具有这样的键的记录,则插入该记录。
REPLACE
似乎可以完成这项工作,但同时它的手册页面也建议使用INSERT ... ON DUPLICATE KEY UPDATE
。
我应该选择哪一种更好?为什么?
我脑海中浮现的REPLACE
唯一的“副作用”是它会递增自增量值(幸运的是我没有使用任何值),而INSERT ... ON DUPLICATE KEY UPDATE
可能不会。在哪些特殊情况下,REPLACE
比INSERT ... ON DUPLICATE KEY UPDATE
更可取,反之亦然?
发布于 2012-02-07 07:34:35
REPLACE
在内部执行delete,然后执行insert。如果有一个外键约束指向该行,这可能会导致问题。在这种情况下,REPLACE
可能会失败,甚至更糟:如果您的外键设置为cascade delete,REPLACE
将导致其他表中的行被删除。即使在REPLACE
操作之前和之后都满足了约束,也可能会发生这种情况。
使用INSERT ... ON DUPLICATE KEY UPDATE
可以避免这个问题,因此最好使用它。
发布于 2013-02-27 04:49:18
在使用REPLACE
而不是INSERT ... ON DUPLICATE KEY UPDATE
时,当多个查询快速到达一个给定的键时,我有时会观察到键锁定或死锁问题。后者的原子性(除了不会导致级联删除)是使用它的更多理由。
发布于 2013-10-24 15:02:21
如果您没有列出所有列,我认为REPLACE
会将所有未提及的列重置为替换行中的默认值。ON DUPLICATE KEY UPDATE
将保留未提及的列不变。
https://stackoverflow.com/questions/9168928
复制相似问题