MySQL UPDATE 支援單表與多表更新,提供 LOW_PRIORITY、IGNORE、ORDER BY、LIMIT 等修飾符。本文系統整理語法細節、行為特性與實戰避坑指南。
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col1=expr1 [, col2=expr2 ...] [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col1=expr1 [, col2=expr2 ...] [WHERE where_condition]
| 修飾符 | 行為 | 適用場景 |
|---|---|---|
| LOW_PRIORITY | 延遲執行直到無讀取鎖定 | 讀多寫少、避免阻塞查詢 |
| IGNORE | 忽略錯誤繼續執行 (重複鍵、資料轉換錯誤) | 批量更新可能有髒資料時 |
| ORDER BY | 按指定順序更新 (單表) | 配合 LIMIT 避免死鎖/控制更新順序 |
| LIMIT N | 限制更新行數 | 大表分批更新、防鎖表過久 |
UPDATE t SET a=a*2, a=a+1; -- 先乘 2 再加 1
mysql_info() 可獲取匹配/更新/警告行數UPDATE items, month SET items.price = month.price WHERE items.id = month.id;
UPDATE t1 LEFT JOIN t2 ON t1.id = t2.t1_id SET t1.status = COALESCE(t2.new_status, 'pending');
ON UPDATE CASCADE-- 分批更新模板 (避免長鎖表、複製日誌暴增)
REPEAT
UPDATE large_table
SET status = 'processed'
WHERE status = 'pending'
AND id > last_id
ORDER BY id
LIMIT 1000;
SET last_id = (SELECT MAX(id) FROM large_table WHERE status = 'processed');
UNTIL ROW_COUNT() = 0 END REPEAT;