MySQL中delete、truncate与drop的区别
三者对比
delete | truncate | drop | |
---|---|---|---|
类型 | 属于DML | 属于DDL | 属于DDL |
回滚 | 可回滚 | 不可回滚 | 不可回滚 |
删除内容 | 删除表的全部或者一部分数据行 | 删除表中的所有数据 | 从数据库中删除表 |
删除速度 | 删除速度慢 | 删除速度快 | 删除速度最快 |
三者图解
对于三者删除上到底是什么区别,概念很抽象,这里用一张图,就很好理解了。
比如现在数据库里有这样一张表:
简单来说,如果把数据库的一张表比作一篇文章的话,delete
相当于把文章整个或者部分内容给遮住了,truncate
则是把文章内容都遮住,drop
则是把文章直接撕碎了
三者详解
- delete
属于DML语言即数据库操作语言,是支持事务的,所以可以回滚
支持逐行删除,即使要删除整表数据,其实执行时也是逐行删除的
只删除数据,表和表的结构依然在
因为要逐行删除,所以速度是最慢的
不会自动提交,事物提交后才生效
在 InnoDB引擎 中,
delete
其实并不会真的把数据删除,mysql 实际上只是给删除的数据打了个标记为已删除,因此delete
删除表中的数据时,表文件在磁盘上所占空间不会变小,存储空间不会被释放,只是把删除的数据行设置为不可见。
用法:
-- 删除整表数据
DELETE FROM table_name
-- 删除部分数据
DELETE FROM table_name
WHERE condition
- truncate
属于DDL语言即数据库定义语言,不支持事务,所以不能回滚
不支持逐行删除,只能删除整表数据
只删除数据,表和表的结构依然在
速度比delete快
表中有外键约束(FOREIGN KEY
)不能用truncate
,需要先解除外键约束
用法:
-- 删除整表数据
TRUNCATE TABLE table_name
- drop
也是DDL语言,不支持事务,不能回滚
这个删除是删的最干净的,数据和表都删除,包括表的索引、权限等
速度是最快的
用法:
-- 删除整表数据
DROP TABLE table_name
对比来看,
delete
能回滚,能逐行删除,所以删除时,还是有回表扫描的过程,因此删除的速度最慢,drop
毫无顾忌全部删除,所以速度最快,truncate
则介于二者之间
如何选择
三者各自的有不同的特点,选择时可以根据其优势来选:
如果需要删除部分数据就选delete
truncate
和drop
要谨慎使用,尤其是数据没有备份的时候,因为不能回滚,删除后数据很难找回
如果要删除整表数据,但表还需要,则用truncate
如果想删库跑路则推荐使用,如果表不再需要了则用drop
drop
彻底删除