ORACLE DROP TABLE和truncate table的区别,以及删除表后,相关的索引是不是也一并删除

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE DROP TABLE和truncate table的区别,以及删除表后,相关的索引是不是也一并删除相关的知识,希望对你有一定的参考价值。

现在有一项工作,远程服务器比较忙,我选择服务器空闲时抓取一批数据在本地进行分析,建立一个JOB,每天运行一次,删除本地相同名称的表后,去抓取数据在本地建立新表,同时建立索引后分析。
现想问,DROP TABLE后,相应的INDEX是不是也会同时被删除
看别人写有关闪回的内容时,发现使用DROP TABLE RECYCLETEST PURGE是可以将表彻底删除而不能恢复,是不是我普通的DROP只会把表放入回收站而不是彻底删除,还占用空间呢?
truncate table 又和这些有什么区别呢?

drop table是删除表。
truncate table是删除表内数据。

truncate是DDL语句,所以它所做的删除是无法通过闪回找回的。
truncate连同索引一并删除。

delete是DML语句,它所做的删除可以通过闪回找回。

truncate删除大量数据时,效率高于delete。
用truncate删除相当于永久删除。
参考技术A truncate table编号重新开始 参考技术B TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。
DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。
如果想保留标识计数值,请改用 DELETE。
如果要删除表定义及其数据,请使用 DROP TABLE 语句。
请参考本回答被提问者采纳

oracle中delete,truncate 和 drop的区别

delete:dml语句,用于删除数据,可以回滚(反悔),可以精确删除。该语句非常耗费资源,需要写undo回滚段,占用大量内存。delete语句是所有dml语句中最消耗资源的语句。
truncat:DDL语句,清除数据。该操作不可回滚,不可精确删除。一旦操作,那么不可找回。节省资源,但是该命令每次清除的基本单位为“段”,比如:table,partition,subpartition等,不能选择清除某些数据。
drop:DDL语句,删除对象操作,上面的delete和truncate都是针对数据的,drop是针对数据的载体的,当然他也可以删除其他的载体,面对基本对象为段。如果不加purge参数,可在回收站找回,否则不可找回。
举个例子:船上有10个人,delete可以定点让某一个人下船,truncate可以让某一层的人下船(分区),或者全部下船,drop就是连船带人一起消失。
参考技术A 语法
delete from aa
truncate table aa
区别
1.delete from后面可以写条件,truncate不可以。
2.delete from记录是一条条删的,所删除的每行记录都会进日志,而truncate一次性删掉整个页,因此日至里面只记录页释放,简言之,delete from更新日志,truncate基本不,所用的事务日志空间较少。
3.delete from删空表后,会保留一个空的页,truncate在表中不会留有任何页。
4.当使用行锁执行 DELETE 语句时,将锁定表中各行以便删除。truncate始终锁定表和页,而不是锁定各行。
5.如果有identity产生的自增id列,delete from后仍然从上次的数开始增加,即种子不变,而truncate后,种子会恢复初始。
6.truncate不会触发delete的触发器,因为truncate操作不记录各个行删除。
总结
1.truncate和 delete只删除数据不删除表的结构(定义)
drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态。
2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发
truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger。
3.delete语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动
显然drop语句将表所占用的空间全部释放
truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage; truncate会将高水线复位(回到最开始)。
4.速度,一般来说: drop> truncate > delete。
5.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及。
6.使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大. 想删除表,当然用drop
想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
参考技术B 语法
delete from aa
truncate table aa
区别
1.delete from后面可以写条件,truncate不可以。

2.delete from记录是一条条删的,所删除的每行记录都会进日志,而truncate一次性删掉整个页,因此日至里面只记录页释放,简言之,delete from更新日志,truncate基本不,所用的事务日志空间较少。

3.delete from删空表后,会保留一个空的页,truncate在表中不会留有任何页。

4.当使用行锁执行 DELETE 语句时,将锁定表中各行以便删除。truncate始终锁定表和页,而不是锁定各行。
5.如果有identity产生的自增id列,delete from后仍然从上次的数开始增加,即种子不变,而truncate后,种子会恢复初始。

6.truncate不会触发delete的触发器,因为truncate操作不记录各个行删除。

总结
1.truncate和 delete只删除数据不删除表的结构(定义)    
   drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态。
 
2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发
    truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger。
 
3.delete语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动    
   显然drop语句将表所占用的空间全部释放    
   truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage;   truncate会将高水线复位(回到最开始)。
 
4.速度,一般来说: drop> truncate > delete。
    
5.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及。

6.使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大.     想删除表,当然用drop    
想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
参考技术C 语法
delete from aa
truncate table aa

区别
1.delete from后面可以写条件,truncate不可以。

2.delete from记录是一条条删的,所删除的每行记录都会进日志,而truncate一次性删掉整个页,因此日至里面只记录页释放,简言之,delete from更新日志,truncate基本不,所用的事务日志空间较少。

3.delete from删空表后,会保留一个空的页,truncate在表中不会留有任何页。

4.当使用行锁执行 DELETE 语句时,将锁定表中各行以便删除。truncate始终锁定表和页,而不是锁定各行。

5.如果有identity产生的自增id列,delete from后仍然从上次的数开始增加,即种子不变,而truncate后,种子会恢复初始。

6.truncate不会触发delete的触发器,因为truncate操作不记录各个行删除。

总结
1.truncate和 delete只删除数据不删除表的结构(定义)
drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态。

2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发
truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger。

3.delete语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动
显然drop语句将表所占用的空间全部释放
truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage; truncate会将高水线复位(回到最开始)。

4.速度,一般来说: drop> truncate > delete。

5.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及。

6.使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大. 想删除表,当然用drop
想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
参考技术D 注意:这里说的delete是指不带where子句的delete语句
相同点
truncate和不带where子句的delete,
以及drop都会删除表内的数据
不同点:
1.
truncate和
delete只删除数据不删除表的结构(定义)
drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index);
依赖于该表的存储过程/函数将保留,但是变为invalid状态.
2.delete语句是dml,这个操作会放到rollback
segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发.
truncate,drop是ddl,
操作立即生效,原数据不放到rollback
segment中,不能回滚.
操作不触发trigger.
3.delete语句不影响表所占用的extent,
高水线(high
watermark)保持原位置不动
显然drop语句将表所占用的空间全部释放
truncate
语句缺省情况下将空间释放到
minextents个
extent,除非使用reuse
storage;
truncate会将高水线复位(回到最开始).
4.速度,一般来说:
drop>;
truncate
>;
delete
5.安全性:小心使用drop
和truncate,尤其没有备份的时候.否则哭都来不及
使用上,想删除部分数据行用delete,注意带上where子句.
回滚段要足够大.
想删除表,当然用drop
想保留表而将所有数据删除.
如果和事务无关,用truncate即可.
如果和事务有关,或者想触发trigger,还是用delete.
如果是整理表内部的碎片,可以用truncate跟上reuse
stroage,再重新导入/插入数据
通俗的讲:
在实际应用中,三者的区别是明确的。
当你不再需要该表时,

drop;
当你仍要保留该表,但要删除所有记录时,

truncate;
当你要删除部分记录时(always
with
a
WHERE
clause),

delete.

以上是关于ORACLE DROP TABLE和truncate table的区别,以及删除表后,相关的索引是不是也一并删除的主要内容,如果未能解决你的问题,请参考以下文章

truncate和delete的区别

truncate;和delete;

详解SQL中drop,delete和truncate的异同

Oracle truncate delete drop区别

sql DELETE,TRUNCATE,DROP TABLE

oracle 中删除表 drop delete truncate