mysql的delete和truncate的区别

从最终的结果来看,虽然使用TRUNCATE操作和使用DELETE操作都可以删除表中的全部记录,但是是不同的:

(1)DELETE为数据操作语言DML;TRUNCATE为数据定义语言DDL。

(2) DELETE操作是将表中所有记录一条一条删除直到删除完;TRUNCATE操作则是保留了表的结构重新创建了这个表,所有的状态都相当于新表。因此,TRUNCATE操作的效率更高。

(3)DELETE操作可以回滚;TRUNCATE操作会导致隐式提交,因此不能回滚

(4)DELETE操作执行成功后会返回已删除的行数(如删除4行记录,则会显示“Affected rows:4”);截断操作不会返回已删除的行数,结果通常是“Affected rows:0”。

(5)DELETE操作删除表中记录后,再次向表中添加新记录时,对于设置有自增约束字段的值会从删除前表中该字段的最大值加1开始自增;TRUNCATE操作则会重新从1开始自增

(6)DELETE在 InnoDB 中,DELETE其实并不会真的把数据删除,MySQL实际上只是给删除的数据打了个标记为已删除,因此 delete 删除表中的数据时,表文件在磁盘上所占空间不会变小,存储空间不会被释放,只是把删除的数据行设置为不可见。虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以重用这部分空间(重用 → 覆盖); delete from table_name删除表的全部数据,对于MyISAM 会立刻释放磁盘空间(InnoDB 不会释放磁盘空间);

TRUNCATE truncate table table_name 立刻释放磁盘空间 ,不管是 InnoDB和MyISAM 。

(7)DELETE执行时,会先将所删除数据缓存到rollback segement中,事务commit之后生效; TRUNCATE 不走事务,原数据不放到 rollback segment 中,操作不触发 trigger,执行后立即生效,无法找回。

 

posted @ 2022-07-07 16:53  修心而结网  阅读(260)  评论(0编辑  收藏  举报