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

MySQL INSERT IF NOT EXISTS 防止重複插入實戰

     編輯:MySQL 資料庫相關知識

業務常見需求:插入前檢查記錄是否存在,僅在不存在時插入。MySQL 提供多種實現方案,核心思路是利用 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
);

子查詢檢查目標表中是否已存在相同 client_id,不存在則插入。

場景二:單條記錄插入

INSERT INTO clients (client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE NOT EXISTS (
    SELECT 1 FROM clients 
    WHERE clients.client_id = 10345
);

dual 是虛擬表,允許 SELECT 直接跟常量值,無需關聯實體表。

替代方案對比

方案優點缺點
NOT EXISTS標準 SQL、可讀性好、支持複雜條件需掃描目標表索引
INSERT IGNORE語法簡單、性能略優會吞噬其他錯誤(如外鍵衝突)
ON DUPLICATE KEY UPDATE可更新已有行需唯一索引、意圖不純粹
REPLACE INTO語法簡潔實際是 DELETE+INSERT,觸發器行為異常

最佳實踐建議

  • 目標表必須有唯一索引或主鍵(示例中 client_id 為主鍵)
  • 高併發場景建議加行鎖:SELECT ... FOR UPDATE 或使用事務
  • 批量操作時確保子查詢利用索引,避免全表掃描
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved