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 UPDATE | Upsert(有則更新、無則新增) | 針對非主鍵欄位更新、支援 VALUES() 函數 |