繼上一篇介紹 MySQL 跨表更新後,今天我們來深入探討跨表刪除。自 MySQL 4.0 版本起,MySQL 開始支援跨表 DELETE 語法,允許在單條 SQL 語句中同時刪除多個表的記錄,或根據多表關聯關係刪除特定表中的記錄。
假設我們有兩張表:product(產品基本信息)和 productPrice(產品價格),兩表通過 productId 關聯。
最直觀的方式是在 FROM 子句中用逗號分隔多個表:
DELETE p.*, pp.*
FROM product p, productPrice pp
WHERE p.productId = pp.productId
AND p.created < '2004-01-01';
此語句會同時刪除兩張表中符合條件的記錄。
更規範的寫法是使用 INNER JOIN:
DELETE p.*, pp.*
FROM product p
INNER JOIN productPrice pp
ON p.productId = pp.productId
WHERE p.created < '2004-01-01';
語義更清晰,便於維護,推薦在生產環境使用。
跨表刪除不一定要刪除所有關聯表的數據。若只想刪除 product 表記錄而保留 productPrice,只需調整 DELETE 子句:
DELETE p.*
FROM product p
INNER JOIN productPrice pp
ON p.productId = pp.productId
WHERE p.created < '2004-01-01';
若需刪除 productPrice 中不存在價格記錄的產品,可用 LEFT JOIN:
DELETE p.*
FROM product p
LEFT JOIN productPrice pp
ON p.productId = pp.productId
WHERE pp.productId IS NULL;
此語句會找出價格表中無對應記錄的產品並刪除。
MySQL 跨表 DELETE 功能強大且靈活,支援隱式連接、INNER JOIN、LEFT JOIN 等多種寫法,能滿足多種業務場景。建議優先使用顯式 JOIN 語法,代碼可讀性更高。歡迎閱讀配套文章《MySQL 跨表更新 多表 UPDATE SQL 語句總結》。