MySQL 中的“INSERT IGNORE”和“INSERT ... ON DUPLICATE KEY UPDATE”有什么区别? [重复]

问题描述 投票:0回答:2

INSERT IGNORE 和 INSERT…ON DUPLICATE KEY UPDATE 之间有什么区别?我也想知道哪一个比另一个更受青睐。有人可以帮忙吗?

mysql database
2个回答
2
投票

如果您使用

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 语句。


0
投票

如果您尝试避免重复违规,则区别在于:如果发生唯一约束违规,则

INSERT IGNORE
不允许指定操作(更改行中的某些内容),而对于
INSERT...ON DUPLICATE KEY UPDATE
,某些操作指定是强制性的。当然,您可以在
INSERT...ON DUPLICATE KEY UPDATE
中指定假更新(例如,
SET id=id
,其中
id
是主键/唯一键) - 在这种情况下没有区别。

INSERT IGNORE
也可能会忽略其他一些可忽略的错误,而不是
INSERT...ON DUPLICATE KEY UPDATE

© www.soinside.com 2019 - 2024. All rights reserved.