MySQL INSERT IGNORE Statement

摘要:在本教程中,您将学习如何使用 MySQL INSERT IGNORE语句将数据插入表中。

MySQL INSERT IGNORE语句简介

当您使用INSERT语句向表中添加多行时,如果处理过程中发生错误,MySQL 将终止该语句并返回错误。结果,没有行被插入到表中。

但是,如果使用INSERT IGNORE语句,则会忽略导致错误的包含无效数据的行,并将包含有效数据的行插入到表中。

INSERT IGNORE语句的语法如下:

INSERT IGNORE INTO table(column_list)
VALUES( value_list),
      ( value_list),
      ...
Code language: SQL (Structured Query Language) (sql)

请注意, IGNORE子句是 MySQL 对 SQL 标准的扩展。

MySQL INSERT IGNORE示例

我们将创建一个名为subscribers新表来进行演示。

CREATE TABLE subscribers (
    id INT PRIMARY KEY AUTO_INCREMENT,
    email VARCHAR(50) NOT NULL UNIQUE
);
Code language: SQL (Structured Query Language) (sql)

UNIQUE约束确保email列中不存在重复的电子邮件。

以下语句将新行插入subscribers表中:

INSERT INTO subscribers(email)
VALUES('john.doe@gmail.com');
Code language: SQL (Structured Query Language) (sql)

它按预期工作。

让我们执行另一个语句,将两行插入到subscribers表中:

INSERT INTO subscribers(email)
VALUES('john.doe@gmail.com'), 
      ('jane.smith@ibm.com');
Code language: SQL (Structured Query Language) (sql)

它返回一个错误。

Error Code: 1062. Duplicate entry 'john.doe@gmail.com' for key 'email'
Code language: SQL (Structured Query Language) (sql)

如错误消息中所示,电子邮件john.doe@gmail.com违反了UNIQUE约束。

但是,如果您使用INSERT IGNORE语句来代替。

INSERT IGNORE INTO subscribers(email)
VALUES('john.doe@gmail.com'), 
      ('jane.smith@ibm.com');
Code language: SQL (Structured Query Language) (sql)

MySQL 返回一条消息,指示插入了一行,而忽略了另一行。

1 row(s) affected, 1 warning(s): 1062 Duplicate entry 'john.doe@gmail.com' for key 'email' Records: 2  Duplicates: 1  Warnings: 1
Code language: SQL (Structured Query Language) (sql)

要查找警告的详细信息,可以使用SHOW WARNINGS命令,如下所示:

SHOW WARNINGS;
Code language: SQL (Structured Query Language) (sql)
MySQL INSERT IGNORE - warning

总之,当您使用INSERT IGNORE语句时,MySQL 不会发出错误,而是会在发生错误时发出警告。

如果你从subscribers表中查询数据,你会发现实际上只插入了一行,而导致错误的行却没有插入。

MySQL INSERT IGNORE - subscribers table

MySQL INSERT IGNORESTRICT模式

严格模式打开时,如果您尝试将无效值插入表中,MySQL 将返回错误并中止INSERT语句。

但是,如果使用INSERT IGNORE语句,MySQL 将发出警告而不是错误。此外,在将值添加到表中之前,它会尝试调整这些值以使它们有效。

考虑以下示例。

首先,我们创建一个名为tokens新表

CREATE TABLE tokens (
    s VARCHAR(6)
);
Code language: SQL (Structured Query Language) (sql)

在此表中,列s仅接受长度小于或等于 6 的字符串。

其次,将长度为 7 的字符串插入到tokens表中。

INSERT INTO tokens VALUES('abcdefg');
Code language: SQL (Structured Query Language) (sql)

MySQL 发出以下错误,因为严格模式已开启。

Error Code: 1406. Data too long for column 's' at row 1
Code language: SQL (Structured Query Language) (sql)

第三,使用INSERT IGNORE语句插入相同的字符串。

INSERT IGNORE INTO tokens VALUES('abcdefg');
Code language: SQL (Structured Query Language) (sql)

MySQL 在将数据插入tokens表之前截断了数据。此外,它还发出警告。

MySQL INSERT IGNORE - strict mode

在本教程中,您学习了如何使用 MySQL INSERT IGNORE语句将行插入表中并忽略导致错误的行。

本教程有帮助吗?