INSERT IGNORE 和 INSERT…ON DUPLICATE KEY UPDATE 之间有什么区别?我也想知道哪一个比另一个更受青睐。有人可以帮忙吗?
如果您使用
INSERT IGNORE
,那么如果导致重复键,则实际上不会插入该行。但该语句不会产生错误。相反,它会生成警告。这些案例包括:
在具有
PRIMARY KEY
或 UNIQUE
约束的列中插入重复键。
将
NULL
插入到具有 NOT NULL
约束的列中。
向分区表插入一行,但插入的值未映射到分区。
如果你使用
REPLACE
,MySQL实际上会在内部执行一个DELETE
,然后是一个INSERT
,这会产生一些意想不到的副作用:
分配新的自增ID。
具有外键的从属行可能会被删除(如果您使用级联外键),否则会阻止
REPLACE
。
在
DELETE
上触发的触发器被不必要地执行。
副作用也会传播到复制从站。
REPLACE
和INSERT...ON DUPLICATE KEY UPDATE
都是特定于MySQL的非标准专有发明。 ANSI SQL 2003 定义了 MERGE 语句,可以解决相同的需求(甚至更多),但 MySQL 不支持 MERGE 语句。
如果您尝试避免重复违规,则区别在于:如果发生唯一约束违规,则
INSERT IGNORE
不允许指定操作(更改行中的某些内容),而对于INSERT...ON DUPLICATE KEY UPDATE
,某些操作指定是强制性的。当然,您可以在 INSERT...ON DUPLICATE KEY UPDATE
中指定假更新(例如,SET id=id
,其中 id
是主键/唯一键) - 在这种情况下没有区别。
INSERT IGNORE
也可能会忽略其他一些可忽略的错误,而不是INSERT...ON DUPLICATE KEY UPDATE
。