Eri*_*rik 2 mysql best-practices upsert mysql-5.6
我是 MySQL 的新手,但我对 SQL Server 有一定的经验。我知道在 SQL Server 中我应该非常谨慎地使用MERGE语句,因为它们会导致一些问题。使用时有什么特别需要注意的ON DUPLICATE KEY UPDATE吗?在 MySQL 社区中,INSERT/UPDATE像 SQL Server 一样坚持使用单独的语句是否被认为是最佳实践,或者ON DUPLICATE KEY UPDATE广泛用于简单的 upserts 是否可以?
首先:
有一些非常罕见的情况需要担心,并且可能会困扰您 - 特别是考虑到您来自 SQL Server 世界:
当您针对具有两个或多个UNIQUE约束的表使用它时。在这些情况下,您不能轻松地为不同的约束违规设置不同的行为(虽然可以使用MERGE语句)。违反 2 个唯一约束之一的
AnINSERT将进入UPDATE子句。如果您想要根据违反哪个约束而做出不同的行为,将很难实现(可能使用一些复杂的CASE表达式,但可能并非在所有场景中都可行)。
与SQL Server(和所有其他主要SQL实现)的一大区别是,UNIQUE约束检查每一行后INSERT或UPDATE不作为SQL标准说在声明的结尾(甚至不考虑延迟约束检查)。
问题在于INSERT ... SELECT ... ON DUPLICATE KEY UPDATE ...;语句,行的处理顺序很重要。如果 SELECT 创建 2 行与 UNIQUE 约束冲突,则将插入第一个要处理的行,第二个将落入UPDATE子句(处理顺序当然取决于执行计划)。这意味着语句后表状态的非确定性结果。因此,在编写此类语句(以及任何UPDATE语句)时必须非常小心。
与上一点相关,INSERT ... ON DUPLICATE KEY UPDATE语句对于基于语句的复制被标记为不安全,因此如果您使用它们,您将被限制为基于行或混合的复制。
| 归档时间: |
|
| 查看次数: |
1066 次 |
| 最近记录: |