MySQL 4.0+ 支援多表 UPDATE/DELETE,透過 JOIN 語法實現關聯寫入。本文系統整理語法變體、LIMIT/ORDER BY 限制、版本門檻、實戰範例與常見錯誤。
-- 標準 JOIN 寫法
UPDATE items i
JOIN month m ON i.id = m.id
SET i.price = m.price;
-- 逗號舊寫法 (相容)
UPDATE items, month
SET items.price = month.price
WHERE items.id = month.id;
ORDER BY、LIMITUPDATE t1 JOIN t2 ON ... JOIN t3 ON ... SET ...SET 子句指定的表/欄位
DELETE t1, t2
FROM t1
JOIN t2 ON t1.id = t2.id
JOIN t3 ON t2.id = t3.id
WHERE t1.status = 1;
DELETE 後列出**實際要刪除行的表** (t1, t2)FROM 後列出**所有參與 JOIN 的表** (t1, t2, t3),t3 僅用於條件過濾,不刪除
DELETE FROM t1, t2
USING t1
JOIN t2 ON t1.id = t2.id
JOIN t3 ON t2.id = t3.id
WHERE t1.status = 1;
USING 關鍵字更直觀區分「刪除目標」與「關聯來源」
-- 刪除最早的一筆錯誤日誌
DELETE FROM error_log
WHERE user = 'jcole'
ORDER BY timestamp ASC
LIMIT 1;
ORDER BY 決定刪除順序,LIMIT 限制刪除行數ORDER BY、LIMITLIMIT 的單表刪除,或用 WHERE id IN (SELECT id FROM ... LIMIT n) 子查詢 (5.7+ 支援)
-- 軟刪除訂單及其明細
UPDATE orders o
JOIN order_items i ON o.id = i.order_id
SET o.deleted = 1, i.deleted = 1
WHERE o.id = 12345
AND o.deleted = 0;
-- 硬刪除 (僅刪除明細表,保留訂單審計)
DELETE i
FROM order_items i
JOIN orders o ON i.order_id = o.id
WHERE o.id = 12345
AND o.status = 'CANCELLED';
UPDATE t1 JOIN t2 ON ... SET t1.col = ... 中 SET 必須使用別名,不可用表名WHERE 條件位置:放在 JOIN ... ON 之後,SET 之前BEFORE/AFTER UPDATE/DELETE 觸發器ON DELETE RESTRICT,多表 DELETE 會報錯,需先處理子表或暫時關閉檢查MySQL 多表 UPDATE/DELETE 以 JOIN 為核心,語法簡潔強大。**關鍵記住:DELETE 後列刪除目標、FROM/USING 列關聯來源、多表不支援 LIMIT/ORDER BY、單表支援**。掌握這兩條語句,即可優雅處理跨表寫入業務。