在本教程中,您将学习如何使用MySQL INSERT IGNORE
语句将数据插入到表中。
1. MySQL INSERT IGNORE语句简介
当使用INSERT语句向表中添加一些行数据并且在处理期间发生错误时,INSERT
语句将被中止,并返回错误消息。因此,可能不会向表中没有插入任何行。
但是,如果使用INSERT INGORE
语句,则会忽略导致错误的行,并将其余行插入到表中。
INSERT INGORE
语句的语法如下:
INSERT IGNORE INTO table(column_list)
VALUES( value_list),
( value_list),
...
请注意,IGNORE
子句是MySQL对SQL标准的扩展。
2. MySQL INSERT IGNORE示例
为了演示,我们将创建一个名为订阅者(subscribers
)的新表。
USE testdb;
CREATE TABLE IF NOT EXISTS subscribers (
id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(50) NOT NULL UNIQUE
);
UNIQUE约束确保电子邮件列中不存在重复的电子邮件。
以下语句在subscribers
表中插入一个新行:
INSERT INTO subscribers(email)
VALUES('yiibai.com@gmail.com');
上面语句它按预期那样工作。接下来,我们来执行另一个语句,将两行插入到subscribers
者表中:
INSERT INTO subscribers(email)
VALUES('yiibai.com@gmail.com'),
('jane.max@ibm.com');
它将返回一个错误:
1062 - Duplicate entry 'yiibai.com@gmail.com' for key 'email'
如错误消息中所示,电子邮件yiibai.com@gmail.com
值重复而导致违反UNIQUE
约束。
但是,如果您使用INSERT IGNORE
语句,则其它语句将会继续执行 -
INSERT IGNORE INTO subscribers(email)
VALUES('yiibai.com@gmail.com'),
('jane.max@ibm.com');
MySQL服务器返回一条消息,显示插入一行,另一行被忽略。
Query OK, 1 row affected
Records: 2 Duplicates: 1 Warnings: 1
如果使用SHOW WARNINGS
语句,就会发现警告的详细信息:
mysql> SHOW WARNINGS;
+---------+------+--------------------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------------------+
| Warning | 1062 | Duplicate entry 'yiibai.com@gmail.com' for key 'email' |
+---------+------+--------------------------------------------------------+
2 rows in set
所以当使用INSERT IGNORE
语句来执行插入数据时,MySQL只发出警告而不是发出错误,以防发生错误退出其它数据无法插入。
如果查询subscribers
表中的数据,就会发现实际只有一行数据插入,导致错误的行被忽略。
mysql> select * from subscribers;
+----+----------------------+
| id | email |
+----+----------------------+
| 4 | jane.max@ibm.com |
| 1 | yiibai.com@gmail.com |
+----+----------------------+
2 rows in set
3. MySQL INSERT IGNORE和STRICT模式
当STRICT
模式打开时,如果您尝试将无效值插入到表中,MySQL将返回错误并中止INSERT
语句。
但是,如果使用INSERT IGNORE
语句,则MySQL将发出警告而不是错误。 此外,它将尝试调整值以使其在插入表之前有效。
请来看看以下示例。
首先,我们创建一个名为tokens
的新表:
USE yiibaidb;
CREATE TABLE IF NOT EXISTS tokens (
s VARCHAR(6)
);
在此表中,列只接受长度小于或等于6
的字符串。接下来,如果将长度为7
的字符串插入到tokens
表中,那么会发生什么?
INSERT INTO tokens VALUES('abcdefg');
由于STRICT
模式已打开,MySQL发出以下错误 -
mysql> INSERT INTO tokens VALUES('abcdefg');
1406 - Data too long for column 's' at row 1
现在,使用INSERT IGNORE
语句重新插入相同的字符串。
INSERT IGNORE INTO tokens VALUES('abcdefg');
将MySQL截断的数据插入到tokens
表中。 此外,它发出警告。使用 SHOW WARNINGS
查看错误提示 -
mysql> SHOW WARNINGS;
+---------+------+----------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 's' at row 1 |
+---------+------+----------------------------------------+
1 row in set
在本教程中,您学习了如何使用MySQL INSERT IGNORE
语句将行插入到表中,并忽略导致错误的行的错误。