早年在百度知道上看到一個關於 MySQL 多表刪除的問題,當時剛入行 21 天,憑藉一點點經驗和臨時測試給出了自以為正確的回答。沒想到很快就被大佬駁回,主要是因為當時斷言「MySQL 不支持單條 DELETE 刪除多表」,這句話過於絕對。雖然當時有一堆理由支撐,但並未深入研究,實在慚愧。
最近有網友再次評論那個舊回答,才逼著我去翻閱官方文檔,發現 MySQL 4.0 以上版本早已支持單條 DELETE 刪除多張表的數據。確實誤人子弟,幸好當時提問者沒採納我的答案,否則罪過大了。
在此總結正確用法,以正視聽:
DELETE t1, t2 FROM t1 INNER JOIN t2 ON t1.ref_id = t2.id WHERE ...
也可以寫成:
DELETE FROM t1, t2 USING t1 INNER JOIN t2 ON t1.ref_id = t2.id WHERE ...
兩種寫法效果一致,核心是利用 JOIN 確定要刪除的關聯行,然後在 DELETE 後列出所有要刪除數據的表別名。
DELETE 刪除多表,需配合觸發器或外鍵級聯刪除實現。DELETE 直接刪除多表,常用 ON DELETE CASCADE 外鍵或觸發器處理。若資料庫版本較老或不支持該特性,可通過以下「前期工作」實現「一條語句刪多表」:
FOREIGN KEY ... ON DELETE CASCADE,刪除主表行時自動刪除從表關聯行。BEFORE DELETE 觸發器,手動刪除從表數據。這兩種方式雖需額外維護成本,但能保證數據一致性,且對應用層透明。
避坑提醒:多表刪除時務必先用
SELECT驗證 JOIN 條件,確認影響範圍後再執行 DELETE,切勿在生產環境盲目執行。