Skip to main content

MySQL INSERT IGNORE语句举例说明

MySQL INSERT IGNORE语句简介

当使用INSERT语句向表中添加多行时,如果在处理过程中发生错误,MySQL将终止该语句并返回错误。因此,表中不会插入任何行。

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

INSERT IGNORE语句的语法如下:

INSERT IGNORE INTO table(column_list)
VALUES( value_list),
( value_list),
...

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

MySQL插入忽略示例

我们将为演示创建一个名为subscribers的新表。

CREATE TABLE subscribers (
id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(50) NOT NULL UNIQUE
);

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

下面的语句在subscribers表中插入新行:

INSERT INTO subscribers(email)
VALUES('john.doe@gmail.com');

一切如期进行。

让我们执行另一条语句,在subscribers表中插入两行:

INSERT INTO subscribers(email)
VALUES('john.doe@gmail.com'),
('jane.smith@ibm.com');

它返回一个错误。

Error Code: 1062. Duplicate entry 'john.doe@gmail.com' for key 'email'

如错误消息中所示,电子邮件已发送至john。doe@gmail.com违反了唯一约束。

但是,如果改用INSERT IGNORE语句。

INSERT IGNORE INTO subscribers(email)
VALUES('john.doe@gmail.com'),
('jane.smith@ibm.com');

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

1 row(s) affected, 1 warning(s): 1062 Duplicate entry 'john.doe@gmail.com' for key 'email' Records: 2  Duplicates: 1  Warnings: 1

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

SHOW WARNINGS;

MySQL INSERT IGNORE - warning

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

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

MySQL INSERT IGNORE - subscribers table

MySQL插入忽略和严格模式

当strict模式打开时,如果试图在表中插入无效值,MySQL将返回一个错误并中止INSERT语句。

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

考虑下面的例子。

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

CREATE TABLE tokens (
s VARCHAR(6)
);

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

其次,在tokens表中插入一个长度为7的字符串。

INSERT INTO tokens VALUES('abcdefg');

MySQL发出了以下错误,因为严格模式处于启用状态。

Error Code: 1406. Data too long for column 's' at row 1

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

INSERT IGNORE INTO tokens VALUES('abcdefg');

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

MySQL INSERT IGNORE - strict mode

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