1.語法
(1)單表
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
(2)多表
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]
-
當您不需要知道已刪除行的數目時,TRUNCATE TABLE語句是一個比沒有WHERE子句的DELETE語句更快的清空表的方法。與DELETE不同,TRUNCATE TABLE不能在事務中使用,或者在表上有鎖。
-
如果您編寫的DELETE語句中沒有WHERE子句,則所有的行都被刪除。當您不想知道被刪除的行的數目時,有一個更快的方法,即使用TRUNCATE TABLE。
-
如果您刪除的行中包括用於AUTO_INCREMENT列的最大值,則該值被重新用於BDB表,但是不會被用於MyISAM表或InnoDB表。如果您在AUTOCOMMIT模式下使用DELETE FROM tbl_name(不含WHERE子句)刪除表中的所有行,則對於所有的表類型(除InnoDB和MyISAM外),序列重新編排。對於InnoDB表,此項操作有一些例外。
-
對於MyISAM和BDB表,您可以把AUTO_INCREMENT次級列指定到一個多列關鍵字中。在這種情況下,從序列的頂端被刪除的值被再次使用,甚至對於MyISAM表也如此。
2.delete用法
(1)單表
mysql> select * from students2;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
| 1 | 555 | 1 | 2 |
| 2 | 555 | 2 | 2 |
| 3 | 555 | 3 | 2 |
| 4 | 555 | 3 | 1 |
| 5 | 555 | 1 | 1 |
+-----+-------+--------+---------+
5 rows in set (0.00 sec)
mysql> delete from students2 where sid=4;
Query OK, 1 row affected (0.05 sec)
mysql> select * from students2;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
| 1 | 555 | 1 | 2 |
| 2 | 555 | 2 | 2 |
| 3 | 555 | 3 | 2 |
| 5 | 555 | 1 | 1 |
+-----+-------+--------+---------+
4 rows in set (0.00 sec)
mysql> delete from students2 limit 1;
Query OK, 1 row affected (0.03 sec)
mysql> select * from students2;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
| 2 | 555 | 2 | 2 |
| 3 | 555 | 3 | 2 |
| 5 | 555 | 1 | 1 |
+-----+-------+--------+---------+
3 rows in set (0.00 sec)
mysql> delete from students2 order by sid desc limit 1;
Query OK, 1 row affected (0.06 sec)
mysql> select * from students2;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
| 2 | 555 | 2 | 2 |
| 3 | 555 | 3 | 2 |
+-----+-------+--------+---------+
2 rows in set (0.00 sec)
mysql> delete from students2;
Query OK, 2 rows affected (0.04 sec)
mysql> select * from students2;
Empty set (0.00 sec)
(2)多表
- 被刪除的表不能出現在查詢子句的子查詢中;
- Low_priority表示刪除語句需要等待其他鏈接的讀此表操作結束后再執行,只作用於MyISAM,MEMORY和MERGE存儲引擎
- Quick是在使用MyISAM存儲引擎時,刪除操作不會合並刪除表的索引端節點,這樣會在一定程度上加快刪除的速度
- Ignore代表會忽略刪除過程中的一些錯誤
- order by子句決定了刪除數據的順序,配合limit子句后在某些情況下非常有用
delete from somelog where user='jcole' order by timestamp_column limit 1;
delete t1,t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id;
delete from t1,t2 using t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id;
對於多表刪除語句,如果想對表使用別名,則只能在table_references子句中使用
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;
3.其他用法注意事項
(1)在MyISAM表中,被刪除的記錄被保留在一個帶鏈接的清單中,后續的INSERT操作會重新使用舊的記錄位置。要重新使用未使用的空間並減小文件的尺寸,則使用OPTIMIZE TABLE語句或myisamchk應用程序重新編排表。OPTIMIZE TABLE更簡便,但是myisamchk速度更快。
(2)QUICK修飾符會影響到在刪除操作中索引端結點是否合並。當用於被刪除的行的索引值被來自后插入的行的相近的索引值代替時,DELETE QUICK最為適用。在此情況下,被刪除的值留下來的空穴被重新使用。
未充滿的索引塊跨越某一個范圍的索引值,會再次發生新的插入。當被刪除的值導致出現未充滿的索引塊時,DELETE QUICK沒有作用。在此情況下,使用QUICK會導致未利用的索引中出現廢棄空間。
(3)如果您打算從一個表中刪除許多行,使用DELETE QUICK再加上OPTIMIZE TABLE可以加快速度。這樣做可以重新建立索引,而不是進行大量的索引塊合並操作。
(4)用於DELETE的MySQL唯一的LIMIT row_count選項用於告知服務器在控制命令被返回到客戶端前被刪除的行的最大值。本選項用於確保一個DELETE語句不會占用過多的時間。您可以只重復DELETE語句,直到相關行的數目少於LIMIT值為止。
(5)如果DELETE語句包括一個ORDER BY子句,則各行按照子句中指定的順序進行刪除。此子句只在與LIMIT聯用是才起作用。
(6)如果您使用的多表MySQL DELETE語句包括InnoDB表,並且這些表受外鍵的限制,則MySQL優化程序會對表進行處理,改變原來的從屬關系。