跟我讀MySQL官方文檔——delete語句


跟我讀MySQL官方文檔——delete語句


說明

本文大部分內容是根據原文檔內容翻譯,按照個人的理解做了排版。

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>


分享到:


相關文章: