MySQL insert ignore語句

2019-10-16 22:58:15

在本教學中,您將學習如何使用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('[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

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語句將行插入到表中,並忽略導致錯誤的行的錯誤。