-- 格式 1:DELETE 後列出目標表
DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.id = t3.id;
-- 格式 2:USING 子句指定關聯表
DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id = t2.id AND t2.id = t3.id;
核心規則:FROM 或 USING 前列出的表(t1, t2)會被刪除;後續表(t3)僅用於關聯條件判斷,不刪除。
-- 刪除訂單及其明細(orders + order_items),保留 products 表
DELETE o, oi FROM `orders` o
JOIN `order_items` oi ON o.id = oi.order_id
JOIN `products` p ON oi.product_id = p.id
WHERE o.created_at < '2020-01-01' AND o.status = 'cancelled';
-- 刪除最早的一筆 jcole 用戶日誌
DELETE FROM `somelog`
WHERE `user` = 'jcole'
ORDER BY `timestamp` ASC
LIMIT 1;
-- 循環刪除,每次 1000 行,避免長事務鎖表
REPEAT
DELETE FROM `big_table`
WHERE `created_at` < '2022-01-01'
LIMIT 1000;
UNTIL ROW_COUNT() = 0 END REPEAT;
或在應用層循環執行單條 DELETE ... LIMIT 1000,配合 ROW_COUNT() 判斷結束。
ON DELETE CASCADE。BEFORE/AFTER DELETE 觸發器。DELETE 權限。DELETE a FROM tbl AS a ... 可簡化寫法。MySQL 多表刪除提供靈活的 DELETE ... FROM ... USING 語法,配合 JOIN 可精確表達複雜關聯刪除邏輯。大量資料刪除務必分批,避免長鎖影響線上業務。