学习过mysql的都知道,我们删除表数据,删除表或者清空表的时候会使用删除语句去进行删除,在MySql中常用来删除语句有drop、truncate、delete,很多刚毕业的人去面试的时候面试官都会问到这个问题说一下这三个之间的区别,本编文章主要就是针对这三个点进行解释。
- drop
drop (删除表):删除内容和定义,释放空间,简单来说就是把整个表去掉,以后要新增数据是不可能的,除非新增一个表。
drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index),依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
如果要删除表定义及其数据,请使用 drop table 语句。
drop table xxxx; //xxxx 代指表名
- truncate
truncate (清空表中的数据):删除内容、释放空间但不删除定义(保留表的数据结构),与drop不同的是,只是清空表数据而已。
注意:truncate不能删除具体行数据,要删就要把整个表清空了。
truncate xxxx; //xxxx 代指表名
- delete
delete (删除表中的数据):delete 语句用于删除表中的行。delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存,以便进行进行回滚操作。
delete from xxxx where id = ?
-
delete语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。
-
truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。
-
如果有自增列,truncate方式删除之后,自增列的值会被初始化,delete方式要分情况(如果数据库被重启了,自增列值也会被初始化,数据库未被重启,则不变),比如当前表的主键ID是递增的,使用truncate时候会从1重新开始。
-
如果要删除表定义及其数据,请使用 drop table 语句
-
安全性:小心使用 drop 和 truncate,尤其没有备份的时候,否则哭都来不及
-
删除速度,一般来说: drop> truncate > delete
drop | truncate | delete | |
---|---|---|---|
条件删除 | 否 | 否 | 是 |
删除表结构 | 是 | 否 | 否 |
触发器 | 否 | 否 | 是 |
事务的方式删除 | 不支持 | 不支持 | 支持 |
具体区别如上所示,如果有什么疑问,欢迎大家下方留言!