首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 中 INSERT IGNORE 與 INSERT INTO 的差異詳解

     編輯:MySQL 綜合教學

前言

在 MySQL 資料庫操作中,資料插入是最基礎也最常用的動作。除了標準的 INSERT INTO,MySQL 還提供了 INSERT IGNORE 這個擴充語法。兩者在處理重複鍵衝突時的行為截然不同,理解它們的差異能幫助開發者避免資料異常、提升寫入效能。本文將透過語法說明、實戰範例與對比測試,深入解析兩者的核心差異與適用場景。

核心差異一覽

特性INSERT INTOINSERT IGNORE
重複主鍵/唯一鍵行為拋出錯誤,終止語句執行忽略錯誤,跳過該筆資料,繼續執行後續語句
資料完整性嚴格保證,不允許重複允許靜默跳過重複資料
回傳值成功返回影響行數,失敗拋錯誤總是返回成功,被忽略的行不計入影響行數
適用場景一般資料寫入、需確保唯一性的業務批次匯入、日誌寫入、冪等性操作、不確定資料是否已存在時

語法與範例

1. 標準 INSERT INTO

最基本的插入語法,支援單筆或多筆資料同時寫入:

-- 單筆插入
INSERT INTO `news` (title, body, time) VALUES ('標題1', '內文1', NOW());

-- 多筆批次插入(效能較佳)
INSERT INTO `news` (title, body, time) 
VALUES ('標題1', '內文1', NOW()), ('標題2', '內文2', NOW());

2. INSERT IGNORE

當遇到主鍵或唯一索引衝突時,不報錯、不回滾,直接跳過該筆資料:

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 也會忽略其他錯誤

INSERT IGNORE 不僅忽略重複鍵錯誤(Error 1062),還會將以下錯誤降級為警告:

  • 資料截斷
  • 無效資料型別轉換
  • 外鍵約束失敗

注意:這可能導致資料品質問題,生產環境建議搭配嚴格的應用層驗證,或改用 INSERT ... ON DUPLICATE KEY UPDATE 以獲得更精確的控制。

最佳實踐建議

  1. 需確保資料唯一、不可重複:使用 INSERT INTO,讓資料庫拋錯,應用層捕捉處理。
  2. 批次匯入、日誌寫入、冪等操作:使用 INSERT IGNORE 可大幅簡化邏輯,避免「先查後插」的競態條件。
  3. 需要更新既有資料:改用 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 是更專業的選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved