delete,truncate和drop的区别

delete,truncate和drop的区别


2024年5月8日发(作者:win7主题变成经典)

delete,truncate和drop的区别

1、truncate和delete只删除数据不删除表的结构(定义),而drop语句将删除表的

结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/

函数将保留,但是变为invalid状态。

2、delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生

效;如果有相应的trigger,执行的时候将被触发。

3、truncate,drop是ddl,操作立即生效,原数据不放到rollback segment中,不

能回滚,操作不触发trigger。

4、delete语句不影响表所占用的extent,高水线(high watermark)保持原位置不动,

truncate 语句缺省情况下将数据空间释放,除非使用reuse storage; truncate会将高水

线复位(回到最开始),drop语句将表所占用的空间全部释放。

5、语句执行速度,一般来说: drop> truncate > delete

6、小心使用drop 和truncate,尤其没有备份的时候,想删除部分数据行用delete,

注意带上where子句。

7、想保留表而将所有数据删除,如果和事务无关,用truncate即可,如果和事务有

关,或者想触发trigger,还是用delete。

8、如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插

入数据。

9、对于由FOREIGN KEY 约束引用的表,不能使用TRUNCATE TABLE,而应使用不

WHERE子句的DELETE语句。

另外,如果没有备份,drop,delete,truncate是否能够恢复?

从直观的感觉来说,似乎这个问题没什么含量,既然都已经drop,或者truncate了,

是一个ddl语句,数据应该是回不来了,如果是delete,并且做了commit,数据也应该

回不来了。

对于这个问题,至少从Oracle的角度来说,答案是可能,而且某些情况下是很可能。

我们来一个一个分析:

首先是drop操作,在Oracle里面,默认情况下是有回收站的功能,就是把一个表做

了drop操作之后,其实从物理上这个表并没有删除,而是简单换了一个很长的名字

如果回收站是开启的(默认开启)

SQL> show parameter recyclebin

NAME TYPE VALUE

---------- ------- ------

recyclebin string on

那么这个时候drop的表是否一定能够恢复呢,还是不一定,为什么,主要有几个原


发布者:admin,转转请注明出处:http://www.yc00.com/xitong/1715151746a2573955.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信