在本教學中,您將學習如何使用MySQL INSERT IGNORE
語句將資料插入到表中。
當使用INSERT語句向表中新增一些行資料並且在處理期間發生錯誤時,INSERT
語句將被中止,並返回錯誤訊息。因此,可能不會向表中沒有插入任何行。
但是,如果使用INSERT INGORE
語句,則會忽略導致錯誤的行,並將其餘行插入到表中。
INSERT INGORE
語句的語法如下:
INSERT IGNORE INTO table(column_list)
VALUES( value_list),
( value_list),
...
請注意,
IGNORE
子句是MySQL對SQL標準的擴充套件。
為了演示,我們將建立一個名為訂閱者(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('[email protected]');
上面語句它按預期那樣工作。接下來,我們來執行另一個語句,將兩行插入到subscribers
者表中:
INSERT INTO subscribers(email)
VALUES('[email protected]'),
('[email protected]');
它將返回一個錯誤:
1062 - Duplicate entry '[email protected]' for key 'email'
如錯誤訊息中所示,電子郵件[email protected]
值重複而導致違反UNIQUE
約束。
但是,如果您使用INSERT IGNORE
語句,則其它語句將會繼續執行 -
INSERT IGNORE INTO subscribers(email)
VALUES('[email protected]'),
('[email protected]');
MySQL伺服器返回一條訊息,顯示插入一行,另一行被忽略。
Query OK, 1 row affected
Records: 2 Duplicates: 1 Warnings: 1
如果使用SHOW WARNINGS
語句,就會發現警告的詳細資訊:
mysql> SHOW WARNINGS;
+---------+------+--------------------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------------------+
| Warning | 1062 | Duplicate entry '[email protected]' for key 'email' |
+---------+------+--------------------------------------------------------+
2 rows in set
所以當使用INSERT IGNORE
語句來執行插入資料時,MySQL只發出警告而不是發出錯誤,以防發生錯誤退出其它資料無法插入。
如果查詢subscribers
表中的資料,就會發現實際只有一行資料插入,導致錯誤的行被忽略。
mysql> select * from subscribers;
+----+----------------------+
| id | email |
+----+----------------------+
| 4 | [email protected] |
| 1 | [email protected] |
+----+----------------------+
2 rows in set
當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
語句將行插入到表中,並忽略導致錯誤的行的錯誤。