首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 多表關聯刪除:單條 DELETE 語句刪除多表關聯數據的正確姿勢

     編輯:MySQL 資料庫相關知識

早年在百度知道上看到一個關於 MySQL 多表刪除的問題,當時剛入行 21 天,憑藉一點點經驗和臨時測試給出了自以為正確的回答。沒想到很快就被大佬駁回,主要是因為當時斷言「MySQL 不支持單條 DELETE 刪除多表」,這句話過於絕對。雖然當時有一堆理由支撐,但並未深入研究,實在慚愧。

最近有網友再次評論那個舊回答,才逼著我去翻閱官方文檔,發現 MySQL 4.0 以上版本早已支持單條 DELETE 刪除多張表的數據。確實誤人子弟,幸好當時提問者沒採納我的答案,否則罪過大了。

在此總結正確用法,以正視聽:

MySQL 4.0+ 多表刪除語法

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 後列出所有要刪除數據的表別名。

其他主流資料庫的支持情況

  • SQL Server:直到 2008 版本仍不支持單條 DELETE 刪除多表,需配合觸發器或外鍵級聯刪除實現。
  • Oracle:不支持 DELETE 直接刪除多表,常用 ON DELETE CASCADE 外鍵或觸發器處理。

不支持原生多表 DELETE 的替代方案

若資料庫版本較老或不支持該特性,可通過以下「前期工作」實現「一條語句刪多表」:

  1. 外鍵級聯刪除:定義 FOREIGN KEY ... ON DELETE CASCADE,刪除主表行時自動刪除從表關聯行。
  2. 觸發器:在主表建立 BEFORE DELETE 觸發器,手動刪除從表數據。

這兩種方式雖需額外維護成本,但能保證數據一致性,且對應用層透明。

避坑提醒:多表刪除時務必先用 SELECT 驗證 JOIN 條件,確認影響範圍後再執行 DELETE,切勿在生產環境盲目執行。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved