說明
本文大部分內容是根據原文檔內容翻譯,按照個人的理解做了排版。
MySQL版本
5.7
原文地址
https://dev.mysql.com/doc/refman/5.7/en/delete.html
概述
DELETE是DML語句,用於從表中刪除行。
單表刪除
單表語法
<code>DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [PARTITION (partition_name [, partition_name] ...)] [WHERE where_condition] [ORDER BY ...] [LIMIT row_count] /<code>
DELETE語句從tbl_name中刪除行,並返回刪除的行數。要檢查已刪除的行數,請調用第12.15節“信息函數”中所述的ROW_COUNT()函數。
主要子句
可選的WHERE子句中的條件標識要刪除的行。沒有WHERE子句,將刪除所有行。
where_condition是一個表達式,對於要刪除的每一行,其值為true。如第13.2.9節“ SELECT語句”中所述指定它。
如果指定了ORDER BY子句,則按指定的順序刪除行。 LIMIT子句限制可以刪除的行數。這些子句適用於單表刪除,但不適用於多表刪除。
筆者注
[]:可選的
[LOW_PRIORITY] [QUICK] [IGNORE]:低優先級、快速、忽略
[PARTITION (partition_name [, partition_name] ...)]:分區,多個分區刪除用()指定
[WHERE where_condition]:where條件
[ORDER BY ...]:排序
[LIMIT row_count]:限制刪除的行數
多表刪除
多表語法
<code>DELETE [LOW_PRIORITY] [QUICK] [IGNORE] tbl_name[.*] [, tbl_name[.*]] ... FROM table_references [WHERE where_condition] DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name[.*] [, tbl_name[.*]] ... USING table_references [WHERE where_condition] /<code>
您可以在DELETE語句中指定多個表,以根據WHERE子句中的條件從一個或多個表中刪除行。您不能在多表DELETE中使用ORDER BY或LIMIT。table_references子句列出了聯接中涉及的表,如第13.2.9.2節“ JOIN子句”中所述(注:官網章節)。
對於第一個多表語法,僅刪除FROM子句之前列出的表中的匹配行。對於第二種多表語法,僅刪除FROM子句中(在USING子句之前)列出的表中的匹配行。結果是您可以同時從許多表中刪除行,並使其他表僅用於搜索:
<code>DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id;/<code>
或者
<code>DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id;/<code>
這些語句在搜索要刪除的行時使用所有三個表,但是僅從表t1和t2刪除匹配的行。
前面的示例使用INNER JOIN,但是多表DELETE語句可以使用SELECT語句中允許的其他類型的聯接,例如LEFT JOIN。例如,要刪除t1中存在但t2中不匹配的行,請使用LEFT JOIN:
<code>DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;/<code>
如果您使用涉及InnoDB表的多表DELETE語句,而該表具有外鍵約束,則MySQL優化器可能以與其父/子關係不同的順序處理表。 在這種情況下,該語句將失敗並回滾。 相反,您應該從單個表中刪除,並依靠InnoDB提供的ON DELETE功能來相應地修改其他表。
注意:
如果為表聲明別名,則在引用表時必須使用別名:
DELETE t1 FROM test AS t1, test2 WHERE ...
多表DELETE中的表別名僅應在語句的table_references部分中聲明。 在其他地方,允許別名引用,但不允許別名聲明。
正確
<code>DELETE a1, a2 FROM t1 AS a1 INNER JOIN t2 AS a2 WHERE a1.id=a2.id; DELETE FROM a1, a2 USING t1 AS a1 INNER JOIN t2 AS a2 WHERE a1.id=a2.id;/<code>
錯誤
<code>DELETE t1 AS a1, t2 AS a2 FROM t1 INNER JOIN t2 WHERE a1.id=a2.id; DELETE FROM t1 AS a1, t2 AS a2 USING t1 INNER JOIN t2 WHERE a1.id=a2.id;/<code>