萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

MySQL 多表刪除語法詳解:JOIN 風格與 USING 風格對比

MySQL 支援跨表單一 DELETE 陳述式刪除多張表資料,語法分為 DELETE t1, t2 FROM ... 與 DELETE FROM t1, t2 USING ... 兩種風格。本文詳細說明語法、執行順序、限制與最佳實務。

語法一:DELETE ... FROM(MySQL 4.0.0+)

DELETE t1, t2
FROM t1
INNER JOIN t2 ON t1.id = t2.id
INNER JOIN t3 ON t2.id = t3.id
WHERE t1.status = 'deleted';
  • DELETE 後列出要刪除的表別名(t1, t2),FROM 後接完整 JOIN 查詢。
  • 只有列在 DELETE 後的表會被刪除,t3 僅供條件過濾。

語法二:DELETE FROM ... USING(MySQL 4.0.2+)

DELETE FROM t1, t2
USING t1
INNER JOIN t2 ON t1.id = t2.id
INNER JOIN t3 ON t2.id = t3.id
WHERE t1.status = 'deleted';
  • USING 子句寫 JOIN 關係,DELETE FROM 列出目標表。
  • 語意相同,部分開發者覺得更易讀。

搭配 ORDER BY 與 LIMIT(單表或多表 4.0.0+)

DELETE FROM somelog
WHERE user = 'jcole'
ORDER BY timestamp
LIMIT 1;
  • 依 timestamp 升冪刪除最舊一筆,適用佇列清理、日誌輪轉。
  • 多表 DELETE 不支援 ORDER BY / LIMIT。

效能與安全建議

  1. 確保 JOIN 條件欄位有索引,避免全表掃描鎖表過久。
  2. 大量刪除分批執行(LIMIT 1000 迴圈),減少鎖衝突與 Binlog 膨脹。
  3. 先用 SELECT 驗證將刪除資料:SELECT t1.*, t2.* FROM t1 JOIN t2 ... WHERE ...
  4. 外鍵約束(ON DELETE CASCADE)可自動級聯刪除,但需謹慎設計。

替代方案

  • 軟刪除:加 deleted_at 欄位,查詢時過濾。
  • 分區表:DROP PARTITION 秒級清理歷史資料。
  • PT-Archiver (Percona Toolkit) 線上歸檔刪除,不鎖表。
copyright © 萬盛學電腦網 all rights reserved