MySQL中delete、truncate与drop的区别

MySQL中delete、truncate与drop的区别

三者对比

delete truncate drop
类型 属于DML 属于DDL 属于DDL
回滚 可回滚 不可回滚 不可回滚
删除内容 删除表的全部或者一部分数据行 删除表中的所有数据 从数据库中删除表
删除速度 删除速度慢 删除速度快 删除速度最快

三者图解

对于三者删除上到底是什么区别,概念很抽象,这里用一张图,就很好理解了。

比如现在数据库里有这样一张表:

MySQL中delete、truncate与drop的区别_第1张图片
简单来说,如果把数据库的一张表比作一篇文章的话,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

truncatedrop要谨慎使用,尤其是数据没有备份的时候,因为不能回滚,删除后数据很难找回

如果要删除整表数据,但表还需要,则用truncate

如果想删库跑路则推荐使用drop,如果表不再需要了则用drop彻底删除

你可能感兴趣的:(MySQL,mysql,数据库,数据库开发,面试,sql)