mysql update on duplicate key_mysql – 我应该警惕ON DUPLICATE KEY UPDATE吗?

首先:

>是的,这很好,也很常见.对于简单的upserts,我会说这是最佳实践.

有一些相当罕见的情况需要担心以及可能会让您感到困惑的事情 – 特别是考虑到您来自SQL Server世界:

>对具有两个或更多UNIQUE约束的表使用它时.在这些情况下,您不能轻易地为不同的约束违规设置不同的行为(虽然可以使用MERGE语句).

违反2个唯一约束中的1个的INSERT将转到UPDATE子句.如果您想要根据违反的约束而需要不同的行为,则很难实现(可能使用一些复杂的CASE表达式,但在所有情况下可能都不可行).

>与SQL Server(以及所有其他主要SQL实现)的一个重大区别是,在每行INSERT或UPDATE之后检查UNIQUE约束,而不是在语句结束时SQL标准所说的(并且甚至不考虑延迟约束检查) ).

问题在于INSERT … SELECT … ON DUPLICATE KEY UPDATE …;声明,行的处理顺序很重要.如果SELECT创建了要在UNIQUE约束上发生冲突的2行,则将插入第一个要处理的行,第二个将落入UPDATE子句(处理顺序当然取决于执行计划).这意味着语句后表的状态的非确定性结果.

因此,在编写这样的语句(以及任何UPDATE语句)时必须非常小心.

>与上一点相关,INSERT … ON DUPLICATE KEY UPDATE语句被标记为基于语句的复制不安全,因此如果使用它们,则限制为基于行或基于混合的复制.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值