Erik Asked: 2016-12-07 12:18:24 +0800 CST2016-12-07 12:18:24 +0800 CST 2016-12-07 12:18:24 +0800 CST 我应该警惕 ON DUPLICATE KEY UPDATE 吗? 772 我是 MySQL 的新手,但我对 SQL Server 有一定的经验。我知道在 SQL Server 中我应该非常谨慎地使用MERGE语句,因为它们会导致一些问题。使用时有什么特别需要注意的ON DUPLICATE KEY UPDATE吗?像在 SQL Server 中那样坚持使用单独的INSERT/UPDATE语句是否被认为是 MySQL 社区的最佳实践,或者ON DUPLICATE KEY UPDATE广泛用于简单的更新插入是否合适? mysql mysql-5.6 1 个回答 Voted Best Answer ypercubeᵀᴹ 2016-12-07T13:33:37+08:002016-12-07T13:33:37+08:00 首先: 是的,这是很好且常见的做法。对于简单的更新,我会说这是最佳实践。 有一些相当罕见的情况需要担心,并且可能会困扰您 - 特别是考虑到您来自 SQL Server 世界: 当您将它用于具有两个或多个UNIQUE约束的表时。在这些情况下,您不能轻松地设置为针对不同的约束违规行为具有不同的行为(虽然可以使用MERGE语句)。 违反 2 个唯一约束中的INSERT1 个的将转到该UPDATE子句。如果您想要根据违反哪个约束而采取不同的行为,则将很难实现(可能使用一些复杂的CASE表达式,但可能并非在所有情况下都可行)。 与 SQL Server(以及所有其他主要 SQL 实现)的一个很大区别是,在每一行之后UNIQUE检查约束,或者不像 SQL 标准在语句末尾所说的那样(甚至不要考虑延迟约束检查)。 INSERTUPDATE 问题是对于INSERT ... SELECT ... ON DUPLICATE KEY UPDATE ...;语句,处理行的顺序很重要。如果 SELECT 创建了 2 个要插入的行,它们在 UNIQUE 约束上发生冲突,则将插入第一个要处理的行,第二个将落入UPDATE子句(处理顺序当然取决于执行计划)。这意味着语句后表状态的非确定性结果。因此,在编写此类语句(实际上是任何语句)时必须非常小心UPDATE。 与前一点相关,INSERT ... ON DUPLICATE KEY UPDATE语句被标记为基于语句的复制不安全,因此如果您使用它们,您将被限制为基于行或混合的复制。
首先:
有一些相当罕见的情况需要担心,并且可能会困扰您 - 特别是考虑到您来自 SQL Server 世界:
当您将它用于具有两个或多个
UNIQUE
约束的表时。在这些情况下,您不能轻松地设置为针对不同的约束违规行为具有不同的行为(虽然可以使用MERGE
语句)。违反 2 个唯一约束中的
INSERT
1 个的将转到该UPDATE
子句。如果您想要根据违反哪个约束而采取不同的行为,则将很难实现(可能使用一些复杂的CASE
表达式,但可能并非在所有情况下都可行)。与 SQL Server(以及所有其他主要 SQL 实现)的一个很大区别是,在每一行之后
UNIQUE
检查约束,或者不像 SQL 标准在语句末尾所说的那样(甚至不要考虑延迟约束检查)。INSERT
UPDATE
问题是对于
INSERT ... SELECT ... ON DUPLICATE KEY UPDATE ...;
语句,处理行的顺序很重要。如果 SELECT 创建了 2 个要插入的行,它们在 UNIQUE 约束上发生冲突,则将插入第一个要处理的行,第二个将落入UPDATE
子句(处理顺序当然取决于执行计划)。这意味着语句后表状态的非确定性结果。因此,在编写此类语句(实际上是任何语句)时必须非常小心UPDATE
。与前一点相关,
INSERT ... ON DUPLICATE KEY UPDATE
语句被标记为基于语句的复制不安全,因此如果您使用它们,您将被限制为基于行或混合的复制。