MySQL中delete、truncate与drop的区别

MySQL中delete、truncate与drop的区别

三者对比

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

三者图解

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

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

图片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彻底删除

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#include编程小黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值