truncate 和 delete

Truncate和Delete在MySQL中用于清除表数据,但二者存在显著差异。Delete操作逐行删除,适合带条件的删除且可回滚,速度较慢;而Truncate通过重建表快速删除所有数据,不支持回滚,且重置自增列。当涉及外键约束时,Truncate会失败,Delete仍可执行。对于大表的删除,可使用Delete配合limit进行分批删除以提高效率。
部署运行你感兴趣的模型镜像

truncate 和 delete 是 MySQL 中清空表数据的两种方式,平常使用的时候两者好像都差不多,选谁都可以。实际上它们之间是有本质区别的,只有深入理解了它们的差异,在以后的开发中才能根据具体场景运用自如

思考

在讲 truncate 和 delete 的区别之前,不妨先看看下面的问题,带着问题边思考边往下看

在这里插入图片描述

问题:如上图所示,红色框(1) 和 红色框(2) 中 id 分别是多少

delete 简述

删除表全部数据或者部分数据,删除的时候是一行一行删除的,所以删除表全部数据时速度比较慢

语句后面可以用 where 过滤待删除的行,比较灵活

语句执行之后会返回本次删除的行数

truncate 简述

删除表全部数据,相当于先 drop table 然后 create table, 速度快

语句后面不能接过滤条件

语句执行后没有返回值,或者说返回值没有具体的含义

区别

虽然 truncate 和 delete 很相似,但它们有以下不同之处

  • delete 是一行一行的删除数据,truncate 是重新创建表,所以truncate 比 delete 速度快,特别是针对大表

  • 其他表有引用本表列的外键时,truncate 会执行失败,delete 可以执行

在这里插入图片描述

上图中 tb表的 idb列是ta表的ida列的外键引用,truncate table ta执行失败, ``delete from ta```能执行成功

  • truncate 是DDL语句,所以不能回滚,delete 是DML语句,可以回滚

  • truncate 返回值无意义, delete 返回本次删除的行数

  • 针对 AUTO_INCREMENT 列,truncate tablename 会把列值重置为起始值,而 delete from tablename 则不会重置(上面的思考题用到了这条知识点)

delete 的优化

前面提到使用 delete 清空大表是速度比较慢,为了保证 delete 语句不会占用大量的时间,可以使用 limit row_count语句来指定单次删除的最大行数,如果删除的行数大于等于单次删除的最大行数,重复执行 delete 语句直到删除的行数小于单次删除的最大值

答案

有了前面的介绍之后,思考题的答案应该很清晰了

因为表 ttid列是自增的,truncate 清空表数据会重置自增列,而 delete则不会,所以思考题中 (1) 处的 id 分别是 3、4, (2) 处的 id 分别是 1,2

具体的输出如下图:

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值