在 MySQL 資料庫操作中,資料插入是最基礎也最常用的動作。除了標準的 INSERT INTO,MySQL 還提供了 INSERT IGNORE 這個擴充語法。兩者在處理重複鍵衝突時的行為截然不同,理解它們的差異能幫助開發者避免資料異常、提升寫入效能。本文將透過語法說明、實戰範例與對比測試,深入解析兩者的核心差異與適用場景。
| 特性 | INSERT INTO | INSERT IGNORE |
|---|---|---|
| 重複主鍵/唯一鍵行為 | 拋出錯誤,終止語句執行 | 忽略錯誤,跳過該筆資料,繼續執行後續語句 |
| 資料完整性 | 嚴格保證,不允許重複 | 允許靜默跳過重複資料 |
| 回傳值 | 成功返回影響行數,失敗拋錯誤 | 總是返回成功,被忽略的行不計入影響行數 |
| 適用場景 | 一般資料寫入、需確保唯一性的業務 | 批次匯入、日誌寫入、冪等性操作、不確定資料是否已存在時 |
最基本的插入語法,支援單筆或多筆資料同時寫入:
-- 單筆插入
INSERT INTO `news` (title, body, time) VALUES ('標題1', '內文1', NOW());
-- 多筆批次插入(效能較佳)
INSERT INTO `news` (title, body, time)
VALUES ('標題1', '內文1', NOW()), ('標題2', '內文2', NOW());
當遇到主鍵或唯一索引衝突時,不報錯、不回滾,直接跳過該筆資料:
INSERT IGNORE INTO `table_name` (col1, col2)
SELECT col1, col2 FROM `source_table`;
-- 建立測試表
CREATE TABLE testtb (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(50),
age INT
);
-- 插入第一筆資料
INSERT INTO testtb (id, name, age) VALUES (1, 'www.111cn.net', 13);
SELECT * FROM testtb;
-- 結果:1, 'www.111cn.net', 13
-- 嘗試插入相同主鍵 id=1,使用 INSERT IGNORE
INSERT IGNORE INTO testtb (id, name, age) VALUES (1, 'aa', 13);
SELECT * FROM testtb;
-- 結果仍為:1, 'www.111cn.net', 13(第二筆被忽略,無錯誤)
-- 對比:使用 REPLACE INTO(會刪除舊資料再插入新資料)
REPLACE INTO testtb (id, name, age) VALUES (1, 'aa', 12);
SELECT * FROM testtb;
-- 結果變為:1, 'aa', 12(原資料被替換)
INSERT IGNORE 不僅忽略重複鍵錯誤(Error 1062),還會將以下錯誤降級為警告:
注意:這可能導致資料品質問題,生產環境建議搭配嚴格的應用層驗證,或改用 INSERT ... ON DUPLICATE KEY UPDATE 以獲得更精確的控制。
INSERT INTO,讓資料庫拋錯,應用層捕捉處理。INSERT IGNORE 可大幅簡化邏輯,避免「先查後插」的競態條件。INSERT ... ON DUPLICATE KEY UPDATE,語法如下:INSERT INTO testtb (id, name, age) VALUES (1, 'new_name', 20)
ON DUPLICATE KEY UPDATE name='new_name', age=20;
INSERT IGNORE 是 MySQL 獨有的實用擴充,適合「寫入不重複、重複不報錯」的場景。但它會吞噬部分錯誤,使用時需清楚資料來源品質。若需更精細的衝突處理,ON DUPLICATE KEY UPDATE 是更專業的選擇。