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 的記錄按指定類型導入,避免主鍵衝突。
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 兼容的虛擬表,無需真實表即可構造常量行。-- 唯一鍵衝突時更新(或忽略)
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 仍有用武之地(如異構數據同步)。