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

MySQL 插入語句深度解析:INSERT、REPLACE 與 INSERT IGNORE 的差異與實戰

     編輯:MySQL 綜合教學

MySQL 三大插入語句差異全解析

MySQL 提供 INSERT、REPLACE、INSERT IGNORE 三種插入變體,針對主鍵/唯一鍵衝突有截然不同的處理邏輯,選擇得當能簡化應用層代碼。

1. INSERT INTO — 標準插入,衝突報錯

INSERT INTO table_name (col1, col2) VALUES (val1, val2);
INSERT INTO table_name SELECT col1, col2 FROM other_table;

行為:若插入值導致主鍵或唯一索引衝突,直接拋出錯誤(Duplicate entry),事務回滾。

2. REPLACE INTO — 衝突則「刪除舊 + 插入新」

REPLACE INTO table_name (id, name) VALUES (1, 'new_name');

機制:

  1. 嘗試插入新行。
  2. 若發現主鍵/唯一鍵已存在 → 先刪除舊行,再插入新行。
  3. 否則直接插入。

⚠ 陷阱:

  • 表必須有主鍵或唯一索引,否則無法判定「重複」,會產生重複資料。
  • 會觸發 DELETE + INSERT 兩個操作,導致 AUTO_INCREMENT 值變化、觸發器雙重觸發、外鍵級聯刪除等副作用。

3. INSERT IGNORE INTO — 衝突靜默跳過

INSERT IGNORE INTO table_name (id, name) VALUES (1, 'ignored');

行為:遇到主鍵/唯一鍵衝突,不報錯、不插入、不回滾,僅產生 Warning,繼續執行後續語句。

適用場景:批量導入去重、日志寫入不重複、冪等性操作。

實戰對比演示

CREATE TABLE test (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO test (name) VALUES ('vein'), ('vein1'), ('vein2');
-- id 自增為 1,2,3

-- 1. 普通 INSERT 衝突
INSERT INTO test (id, name) VALUES (1, 'vein11');
-- ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

-- 2. INSERT IGNORE 靜默跳過
INSERT IGNORE INTO test (id, name) VALUES (1, 'vein11');
-- Query OK, 0 rows affected, 1 warning (0.00 sec)
-- 資料未變更,id=1 仍為 'vein'

-- 3. REPLACE INTO 覆蓋更新
REPLACE INTO test (id, name) VALUES (1, 'vein11');
-- Query OK, 2 rows affected (0.01 sec)  ← 1 delete + 1 insert
-- 結果:id=1, name='vein11'

選型建議

語句衝突行為適用場景性能/副作用
INSERT報錯中止嚴格業務,必須感知衝突最輕量,無副作用
INSERT IGNORE靜默跳過批量去重、冪等寫入、日志輕量,但會產生 Warning
REPLACE刪舊插新需全量覆蓋的「Upsert」語義重,觸發 DELETE+INSERT,影響自增ID/觸發器/外鍵

現代替代方案:MySQL 8.0+ 推薦使用 INSERT ... ON DUPLICATE KEY UPDATE 實現真正的 Upsert,僅更新指定列,避免 REPLACE 的副作用。

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