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 違反),轉為警告 | 批次清理髒資料 |
-- 刪除最舊 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;
多表 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 級聯最佳實踐,即可安全高效執行資料清理作業。