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

MySQL 記錄不存在時插入:INSERT ... SELECT ... WHERE NOT EXISTS 實戰模式

     編輯:MySQL 資料庫相關知識

核心模式

INSERT INTO 目標表 (列1, 列2, ...)
SELECT 值1, 值2, ...
FROM 源表/虛擬表
WHERE NOT EXISTS (
    SELECT 1 FROM 目標表 WHERE 目標表.主鍵 = 源表/值.主鍵
);

場景一:多條記錄遷移(供應商 → 客戶)

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 中不存在於 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/Oracle 兼容的虛擬表,無需真實表即可構造常量行。
  • 適用於應用層「不存在則插入」邏輯(Upsert 前身)。

現代替代方案(MySQL 8.0+ 推薦)

-- 唯一鍵衝突時更新(或忽略)
INSERT INTO clients (client_id, client_name, client_type)
VALUES (10345, 'IBM', 'advertising')
ON DUPLICATE KEY UPDATE client_name=VALUES(client_name);

-- 僅插入不存在(忽略衝突)
INSERT IGNORE INTO clients (client_id, client_name, client_type)
VALUES (10345, 'IBM', 'advertising');

ON DUPLICATE KEY UPDATE 原子性更強、無競態條件、性能更優,建議替代 WHERE NOT EXISTS 模式。

性能提示

  • 目標表主鍵/唯一索引必須存在,否則全表掃描極慢。
  • 大批量操作時,INSERT ... SELECT 配合 WHERE NOT EXISTS 仍有用武之地(如異構數據同步)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved