重庆思庄Oracle、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3276|回复: 0
打印 上一主题 下一主题

[PL/SQL] drop、truncate、delete之间的区别

[复制链接]
跳转到指定楼层
楼主
发表于 2020-3-6 18:57:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.drop
  • Drop table除了在数据库层面删除表,还会在系统层面删除xxx.ibd,xxx.frm(InnoDB表)或 xxx.MYD,xxx.MYI,xxx.frm (MyISAM)等文件。
  • drop table if exists table_name可以防止表不存在的报错,但是会有一个warning。
  • drop table也会隐式提交,除了临时表。

2.truncate
  • 逻辑上truncate table和delete from table_name相似,但是过程是先drop table,然后在re-create table,如果要清空一个大表的所有数据行,truncate比delete高效
  • Truncate是一个DDL操作,一旦执行会隐式提交,这就说明truncate无法rollback,所以执行之前需谨慎
  • 如果表被锁住,truncate会报错
  • 如果有外键约束,truncate会报错
  • 对于InnoDB/MyISAM表的auto_increment的列,truncate table之后可以重新使用序列值。
  • truncate table无法触发delete相关的触发器。

3.delete
  • Delete是DML操作,如果没有提交,可以rollback。
  • 对于InnoDB/MyISAM表的auto_increment的列,delete table之后无法重新使用序列值,但是重启之后可以重新使用序列。
  • Delete from table_name后面一定要跟where条件,否则会删除表的所有行。

总结:
1.执行效率:drop > truncate > delete
2.在使用drop和truncate时一定要注意,虽然可以恢复,但为了减少麻烦,还是需谨慎
3.如果想删除部分数据用delete,注意带上where子句,回滚段要足够大。

4.如果想删除,当然用drop。
5.如果想保留表而将所有数据删除,如果和事务无关,用truncate。
6.如果和事务有关,或者想触发trigger,还是用delete。
7.如果是整理表内部碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2024-4-23 21:39 , Processed in 0.084779 second(s), 20 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表