首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL INSERT ... SELECT 不存在則插入:多行與單行實現模式

     編輯:MySQL 資料庫相關知識

MySQL 「不存在則插入」兩大經典模式:多行遷移與單行業務

利用 INSERT ... SELECT ... WHERE NOT EXISTS 模式,無需存儲過程即可實現冪等寫入。適用於數據遷移、同步、防重複業務插入。

場景一:多行數據遷移/同步(表間複製)

INSERT INTO clients (client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE NOT EXISTS (
    SELECT 1 FROM clients
    WHERE clients.client_id = suppliers.supplier_id
);
  • 從 suppliers 選取目標行。
  • 子查詢以 client_id = supplier_id 為鍵判斷是否已存在。
  • 不存在的行批量插入 clients。

場景二:單行業務插入(使用 DUAL 虛表)

INSERT INTO clients (client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE NOT EXISTS (
    SELECT 1 FROM clients
    WHERE client_id = 10345
);
  • DUAL 是 MySQL 虛擬表,允許 SELECT 直接跟常量值,無需真實表。
  • 適用於應用層「註冊/新增」邏輯,避免「先查後插」的競態條件。

性能與並發考量

方案優點缺點適用場景
INSERT ... WHERE NOT EXISTS單語句原子性,無鎖競爭大批量時子查詢開銷大中小批量、業務冪等寫入
INSERT IGNORE / ON DUPLICATE KEY UPDATE語法簡潔,大批量高效需唯一鍵約束,IGNORE 靜默吞錯誤大數據導入、日志寫入
REPLACE INTO覆蓋語義明確實為 DELETE+INSERT,觸發器/自增ID副作用需全量覆蓋場景

最佳實踐建議

  1. **業務鍵建立唯一索引**,配合 INSERT IGNORE 或 ON DUPLICATE KEY UPDATE 為首選。
  2. 無唯一鍵或跨表同步時,使用本文 NOT EXISTS 模式。
  3. 大批量(>1萬行)建議分批提交,避免長事務鎖表。
  4. 監控 Innodb_row_lock_waits 指標,評估並發衝突。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved