利用 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。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副作用 | 需全量覆蓋場景 |
INSERT IGNORE 或 ON DUPLICATE KEY UPDATE 為首選。NOT EXISTS 模式。Innodb_row_lock_waits 指標,評估並發衝突。