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优化程序会对表进行处理,改变原来的从属关系。