Oracle中的Truncate和Delete语句

 

Oracle中的Truncate和Delete语句

 

 

 

首先讲一下,truncate命令:  

 

语法:TRUNCATE  TABLE  table;

 

表格里的数据被清空,存储空间被释放。

 

运行后会自动提交,包括之前其它未提交的会话,因而一旦清空无法回退。

 

只有表格的创建者或者其他拥有删除任意表格权限的用户(如DBA)才能清空表格。

 

TRUNCATE  TABLE  dept30;

 

Table truncated.

 

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

 

下面讲一下truncate命令和delete的区别:

 

1、TRUNCATE在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令DELETE将被撤销,而TRUNCATE则不会被撤销。

 

2、TRUNCATE是一个DDL语言,向其他所有的DDL语言一样,他将被隐式提交,不能对TRUNCATE使用ROLLBACK命令。 

 

3、TRUNCATE将重新设置高水平线和所有的索引。在对整个表和索引进行完全浏览时,经过TRUNCATE操作后的表比DELETE操作后的表要快得多。 

 

4、TRUNCATE不能触发任何DELETE触发器。 

 

5、不能授予任何人清空他人的表的权限。 

 

6、当表被清空后表和表的索引讲重新设置成初始大小,而delete则不能。 

 

7、不能清空父表。 TRUNCATE TABLE (schema)table_name DROP(REUSE) STORAGE 在默认是 DROP STORAGE 当使用DROP STORAGE时将缩短表和表索引,将表收缩到最小范围,并重新设置NEXT参数。REUSE STORAGE不会缩短表或者调整NEXT参数在特殊情况下使用 REUSE ST

 

 

 

DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的的删除操作作为事务记录在日志中保存以便进行进行回滚操作。

 

TRUNCATE TABLE 则一次性地从表中删除所有的数据页并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。

 

 

 

===========================================================

 

 

 

TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。

 

DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

 

TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。

 

如果想保留标识计数值,请改用 DELETE。

 

如果要删除表定义及其数据,请使用 DROP TABLE 语句。

 

 

 

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

 

以上只是介绍一下两个命令的用法,下面说一下我的推荐用法,truncate命令速度快,占用资源少,如果你能确定当前表里的数据完全没有用的话可以使用此命令,方面快捷,如果数据或许有用,那你最好做好备份,否则一旦使用此命令,就悔不当初了,当然delete命令还是有好处的,如果不能保证此后的数据有不有用,但是当前不知道,或者干脆就是误删了,那么使用rollback命令直接回滚,当然rollback命令可以添加回滚点,定位回滚,恢复数据比较方便,所以说对与初学者,楼主强烈建议大家删除数据时使用delete命令,麻烦事麻烦了点,但是保险一点,这是我的教训啊,误用truncate命令清空了一个表,还好这个表是无关紧要的,否则我就只有以谢天下了。当然,非常强烈的建议是,做任何操作前,对于有用的数据都要事先备份,不管用不用得着,有备无患。

 

posted @ 2013-09-10 13:38  PianoCoder  阅读(18698)  评论(0编辑  收藏  举报