首先:
>是的,这很好,也很常见.对于简单的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语句被标记为基于语句的复制不安全,因此如果使用它们,则限制为基于行或基于混合的复制.