MySQL中truncate和delete的坑
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 则不会重置(上⾯的思考题⽤到了这条知识点)
truncate的特征delete 的优化
前⾯提到使⽤ delete 清空⼤表是速度⽐较慢,为了保证 delete 语句不会占⽤⼤量的时间,可以使⽤limit row_count语句来指定单次删除的最⼤⾏数,如果删除的⾏数⼤于等于单次删除的最⼤⾏数,重复执⾏ delete 语句直到删除的⾏数⼩于单次删除的最⼤值
答案
有了前⾯的介绍之后,思考题的答案应该很清晰了
因为表tt中id列是⾃增的,truncate 清空表数据会重置⾃增列,⽽ delete则不会,所以思考题中 (1) 处的 id 分别是 3、4, (2) 处的 id 分别是 1,2
具体的输出如下图:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论