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

MySQL 多表刪除語法詳解:雙格式、JOIN 刪除與 LIMIT 控制

     編輯:MySQL 資料庫相關知識

兩種標準語法格式(4.0.0+ / 4.0.2+)

-- 格式 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';

ORDER BY + LIMIT 控制刪除數量(單表,4.0.0+)

-- 刪除最早的一筆 jcole 用戶日誌
DELETE FROM `somelog`
WHERE `user` = 'jcole'
ORDER BY `timestamp` ASC
LIMIT 1;
  • 適用於「刪除前 N 筆」或「保留最近 N 筆」場景。
  • 多表刪除不支援 ORDER BY / LIMIT(4.0 限制)。

分批刪除大量資料最佳實踐

-- 循環刪除,每次 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() 判斷結束。

注意事項

  1. 外鍵約束:若有 FK,需先刪子表或設定 ON DELETE CASCADE。
  2. 觸發器:多表刪除會觸發各目標表的 BEFORE/AFTER DELETE 觸發器。
  3. 權限:需對所有目標表擁有 DELETE 權限。
  4. 別名支援:DELETE a FROM tbl AS a ... 可簡化寫法。

總結

MySQL 多表刪除提供靈活的 DELETE ... FROM ... USING 語法,配合 JOIN 可精確表達複雜關聯刪除邏輯。大量資料刪除務必分批,避免長鎖影響線上業務。

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