MySQL INSERT IGNORE语句
摘要:在本教程中,您将学习如何使用MySQL INSERT IGNORE
语句将数据插入表中。
MySQL INSERT IGNORE
语句介绍
当您使用该INSERT
语句向一个表中添加多行时,如果在处理过程中发生错误,则MySQL终止该语句并返回错误。结果,没有行插入到表中。
但是,如果使用该INSERT IGNORE
语句,则会忽略包含导致错误的无效数据的行,并将具有有效数据的行插入表中。
该INSERT IGNORE
语句的语法如下:
1 2 3 4 | INSERT IGNORE INTO table(column_list) VALUES( value_list), ( value_list), ... |
注意,该IGNORE
子句是MySQL对SQL标准的扩展。
MySQL INSERT IGNORE
示例
我们将创建一个新的表名为subscribers
为示范。
1 2 3 4 | CREATE TABLE subscribers ( id INT PRIMARY KEY AUTO_INCREMENT, email VARCHAR(50) NOT NULL UNIQUE ); |
该UNIQUE
约束确保该email
列中不存在重复的电子邮件。
以下语句在subscribers
表中插入新行 :
1 2 | INSERT INTO subscribers(email) VALUES('john.doe@gmail.com'); |
它按预期工作。
让我们执行另一个在表中插入两行的语句 subscribers
:
1 2 3 | INSERT INTO subscribers(email) VALUES('john.doe@gmail.com'), ('jane.smith@ibm.com'); |
它返回一个错误。
1 | Error Code: 1062. Duplicate entry 'john.doe@gmail.com' for key 'email' |
如错误消息中所示,电子邮件john.doe@gmail.com
违反了UNIQUE
约束。
但是,如果使用INSERT IGNORE
语句代替。
1 2 3 | INSERT IGNORE INTO subscribers(email) VALUES('john.doe@gmail.com'), ('jane.smith@ibm.com'); |
MySQL返回一条消息,指示已插入一行,而另一行被忽略。
1 | 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
如下所示的命令:
1 | SHOW WARNINGS; |
总之,当您使用该INSERT IGNORE
语句时,MySQL会发出警告,以防发生错误,而不是发出错误。
如果从subscribers
表中查询数据,则会发现实际上只插入了一行,而导致错误的行却没有插入。
MySQL INSERT IGNORE
和STRICT
模式
当严格模式是,MySQL的返回一个错误并中止INSERT
声明,如果你尝试插入无效值插入表中。
但是,如果使用该INSERT IGNORE
语句,MySQL将发出警告而不是错误。另外,在将值添加到表之前,它将尝试调整值以使其有效。
考虑以下示例。
1 2 3 | CREATE TABLE tokens ( s VARCHAR(6) ); |
在此表中,该列s
仅接受长度小于或等于6的字符串。
第二,在tokens
表中插入一个长度为7的字符串。
1 | INSERT INTO tokens VALUES('abcdefg'); |
由于启用了严格模式,MySQL发出了以下错误。
1 | Error Code: 1406. Data too long for column 's' at row 1 |
第三,使用该INSERT IGNORE
语句插入相同的字符串。
1 | INSERT IGNORE INTO tokens VALUES('abcdefg'); |
MySQL在将数据插入tokens
表之前将其截断。此外,它还会发出警告。
在本教程中,您学习了如何使用MySQL INSERT IGNORE
语句将行插入表中,并忽略导致错误的行的错误。