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

MySQL INSERT 語法詳解:DELAYED、IGNORE、ON DUPLICATE KEY UPDATE 實戰

     編輯:MySQL 資料庫相關知識

INSERT 基本語法

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    VALUES ({expr | DEFAULT},...),(...),...
    [ON DUPLICATE KEY UPDATE col_name=expr, ...]

-- 或使用 SET 語法
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    SET col_name={expr | DEFAULT}, ...
    [ON DUPLICATE KEY UPDATE col_name=expr, ...]

-- 或從 SELECT 插入
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    SELECT ...
    [ON DUPLICATE KEY UPDATE col_name=expr, ...]

1. DELAYED 延遲插入

  • 適用於大量寫入、不需即時可見的場景
  • 資料先放入隊列,立即回傳狀態給客戶端
  • 讀取請求到來時隊列掛起,讀取完成後繼續插入
  • 限制: 忽略 SELECT、ON DUPLICATE KEY UPDATE;無法使用 LAST_INSERT_ID();從屬複寫中被忽略;隊列僅在記憶體中,崩潰會丟失未寫入資料

2. IGNORE 忽略錯誤

  • MySQL 擴展語法
  • 遇到重複鍵值錯誤或嚴格模式警告時,跳過該行繼續執行
  • 常用於「不存在則插入,存在則忽略」:
    INSERT IGNORE INTO tb(...) VALUES(...)

3. ON DUPLICATE KEY UPDATE 重複鍵更新

  • 若插入導致唯一索引或主鍵衝突,轉為 UPDATE 操作
  • 範例:INSERT INTO t(a,b,c) VALUES(1,2,3) ON DUPLICATE KEY UPDATE c=c+1; 等同於 UPDATE t SET c=c+1 WHERE a=1;
  • 受影響行數:新增為 1,更新為 2
  • 可使用 VALUES(col_name) 參考插入值:
    INSERT INTO t(a,b,c) VALUES(1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
  • 啟用此子句時 DELAYED 會被忽略

總結對比

模式適用場景關鍵特性
DELAYED高併發寫入、不關心即時性非阻塞、隊列緩衝、崩潰可能丟資料
IGNORE唯一鍵去重、不需更新衝突靜默跳過、僅保留首行
ON DUPLICATE KEY UPDATEUpsert(有則更新、無則新增)針對非主鍵欄位更新、支援 VALUES() 函數
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved