MySQL-5.7DELETE语句详解
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。
mysql面试题详解如果您删除的⾏中包括⽤于AUTO_INCREMENT列的最⼤值,则该值被重新⽤于BDB表,但是不会被⽤于MyISAM表或InnoDB表。如果您在AUTOCOMMIT模式下使⽤DELETE FROM tbl_name(不含W
HERE⼦句)删除表中的所有⾏,则对于所有的表类型(除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;
数据库系统原理第五版pdfQuery 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)多表html省份选择下拉菜单
被删除的表不能出现在查询⼦句的⼦查询中;
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优化程序会对表进⾏处理,改变原来的从属关系。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。