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

MySQL DELETE 語法完整解析:單表、多表、修飾符、LIMIT、ORDER BY 與分區

     編輯:MySQL 資料庫相關知識

單表語法

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]

多表語法 (兩種等價形式)

-- 形式 1:刪除 FROM 前列出的表
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
tbl_name[.*] [, tbl_name[.*] ...]
FROM table_references
[WHERE where_condition]

-- 形式 2:刪除 FROM ... USING 之間列出的表
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROM tbl_name[.*] [, tbl_name[.*] ...]
USING table_references
[WHERE where_condition]

修飾符詳解

修飾符效果適用場景
LOW_PRIORITY延遲執行,直到無其他讀取執行緒避免阻塞高頻 SELECT
QUICK (MyISAM)不合併索引葉節點,加速刪除刪除值會被相近新值取代 (如遞增 ID 刪舊插新)
IGNORE忽略刪除過程錯誤 (如 FK 違反),轉為警告批次清理髒資料

QUICK 深度解析

  • **適用**:刪除範圍在索引低端,新插入值在高端 (如 `AUTO_INCREMENT` 尾部插入),空洞會被重用
  • **不適用**:刪除導致索引頁面稀疏且新值不落入該範圍 → 產生碎片,**需 `OPTIMIZE TABLE` 整理**
  • **最佳組合**:`DELETE QUICK` 大量刪除 + `OPTIMIZE TABLE` 重建索引,比逐行合併快得多

LIMIT 與 ORDER BY

  • `LIMIT row_count`:限制單次刪除最大行數,防止長鎖表。配合迴圈分批刪除大量資料
  • `ORDER BY col LIMIT N`:按順序刪除前 N 筆 (如刪最舊日誌)。**僅單表支援**,多表不可用
-- 刪除最舊 1 筆 jcole 的日誌
DELETE FROM somelog
WHERE user = 'jcole'
ORDER BY timestamp_column
LIMIT 1;

多表刪除範例

-- 刪除 t1、t2 中符合條件的行,t3 僅作關聯查詢
DELETE t1, t2 FROM t1, t2, t3
WHERE t1.id = t2.id AND t2.id = t3.id;

-- 等價 USING 形式
DELETE FROM t1, t2 USING t1, t2, t3
WHERE t1.id = t2.id AND t2.id = t3.id;

InnoDB 外鍵限制

多表 DELETE 涉及 FK 受限表時,優化器可能改變刪除順序導致錯誤。**建議單表刪除 + 依賴 `ON DELETE CASCADE/SET NULL`** 由引擎自動級聯。

跨資料庫刪除

DELETE db1.t1, db2.t2 FROM db1.t1, db2.t2 WHERE ...

跨庫時**不可使用別名**。

子查詢限制

**不能**在同一張表上同時執行 `DELETE` 並 `SELECT` 子查詢 (會報錯 `You can't specify target table for update in FROM clause`)。

結語

掌握 `DELETE` 的單/多表語法、`QUICK/LOW_PRIORITY/IGNORE` 三大修飾符、`LIMIT+ORDER BY` 分批刪除、InnoDB FK 級聯最佳實踐,即可安全高效執行資料清理作業。

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