UPDATE table_name SET col1 = xx, col2 = yy WHERE col = zz;
核心在於 WHERE 條件精準鎖定目標列。
例:依據 table_2 中 sid=10 的 uid,將 table_1 對應行的 score 加 5。
UPDATE table_1
SET score = score + 5
WHERE uid IN (SELECT uid FROM table_2 WHERE sid = 10);
IN (SELECT...) 處理較弱,大資料量易退化為全表掃描。UPDATE table_1 t1
INNER JOIN table_2 t2 ON t1.uid = t2.uid
SET t1.score = t1.score + 5
WHERE t2.sid = 10;
LEFT JOIN 需求(如:無論是否匹配皆更新,未匹配設預設值)。UPDATE Track
INNER JOIN MV ON Track.trkid = MV.mvid
SET Track.is_show = MV.is_show
WHERE Track.trkid < 6;
UPDATE Track, MV
SET Track.is_show = MV.is_show
WHERE Track.trkid = MV.mvid AND Track.trkid < 6;
ANSI SQL-92 標準建議使用明確 JOIN 語法,可讀性與維護性更佳。
t1, t2),避免欄位歧義。SET t1.col = t2.col, t2.flag = 1 可同時更新多張表欄位。START TRANSACTION; ... COMMIT; 確保原子性。ON 後)與 WHERE 篩選欄位務必建立索引。| 場景 | 推薦寫法 | 理由 |
|---|---|---|
| 小資料量(<1萬行) | 子查詢或 JOIN 均可 | 差異微乎其微,優先可讀性 |
| 大資料量、高併發 | INNER JOIN | 優化器支援更好,易用到索引 |
| 需保留左表所有行 | LEFT JOIN | 子查詢難以表達「無匹配也更新」 |
| 更新條件極其複雜 | CTE (WITH) + JOIN | MySQL 8.0+ 支援,邏輯清晰 |
多表 UPDATE 首選 INNER JOIN 語法,兼具效能與可讀性。理解 JOIN 類型差異(INNER/LEFT/RIGHT)並善用索引,是寫出高效 SQL 的關鍵。