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避免了这个问题,因此是首选.
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行
当使用REPLACE而不是INSERT ... ON DUPLICATE KEY UPDATE,当有多个查询快速到达给定密钥时,我有时会观察到密钥锁定或死锁问题.后者的原子性(除了不导致级联删除)更有理由使用它.
| 归档时间: |
|
| 查看次数: |
27221 次 |
| 最近记录: |