delete、drop和truncate之间的区别

数据库中,delete、drop和truncate之间的区别及应用场景

区别描述

在MySQL中,delete、truncate和drop都是用来删除数据的关键字,但是它们的作用不同。

delete是DML操作语言,只删除数据不删除表的结构,会走事务,执行时会触发trigger
在InnoDB中,delete 并不会真的把数据删除,MySQL 实际上只是给删除的数据打了个标记为已删除(假删除),因此 DELETE 删除表中的数据时,表文件在磁盘上所占空间不会变小,存储空间不会被释放,只是把删除的数据行设置为不可见。虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以重用这部分空间。

truncate属于数据库 DDL定义语言,不走事务,原数据不放到rollback segment中,操作不触发trigger。执行后立即生效,清除数据,无法找回。truncate能够快速清空一个表,并且重置auto_increment的值。

对于不同的类型存储引擎需要注意:

  • 对于MyISAM,truncate会重置auto_increment(自增序列)的值为1。而delete后表仍然保持auto_increment。
  • 对于InnoDB,truncate会重置auto_increment的值为1。delete后表仍然保持auto_increment。但是在做delete整个表之后重启MySQL的话,则重启后的auto_increment会被置为1。也就是说,InnoDB的表本身是无法持久保存auto_increment。

drop属于数据库DDL定义语言。执行后立即生效,无法找回。drop语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为invalid状态。

应用场景

  • delete:可以根据条件删除表中满足条件的数据;如果不指定where子句,则删除表中所有记录
  • truncate:清空表中所有的数据,并重置auto_increment
  • drop:删除整个表(结构和数据)

总结

就像是一本书,delete删除只是把指定页画了个删除标记,占用空间其实还在,只是看不到内容了,还有恢复的可能;truncate删除则是把内容全撕掉给烧了,书皮还在;drop删除相当于把这整本书丢进火里烧了。

在执行速度上:drop > truncate > delete

参考

面试官灵魂一问: MySQL 的 delete、truncate、drop 有什么区别?
面试突击:truncate、delete和drop的6大区别!
delete,drop,truncate 区别
drop、truncate和delete的区别