Oracle中的Truncate和Delete语句
中的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
truncate删除数据
DELETE语句执⾏删除的过程是每次从表中删除⼀⾏,并且同时将该⾏的的删除操作作为事务记录在⽇志中保存以便进⾏进⾏回滚操作。TRUNCATE TABLE 则⼀次性地从表中删除所有的数据页并不把单独的删除操作记录记⼊⽇志保存,删除⾏是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执⾏速度快。
===========================================================
TRUNCATE TABLE 在功能上与不带 WHERE ⼦句的 DELETE 语句相同:⼆者均删除表中的全部⾏。但 TRUNCATE TABLE ⽐ DELETE 速度快,且使⽤的和事务⽇志资源少。
DELETE 语句每次删除⼀⾏,并在事务⽇志中为所删除的每⾏记录⼀项。TRUNCATE TABLE 通过释放存储表数据所⽤的数据页来删除数据,并且只在事务⽇志中记录页的释放。
TRUNCATE TABLE 删除表中的所有⾏,但表结构及其列、约束、索引等保持不变。新⾏标识所⽤的计数值重置为该列的种⼦。
如果想保留标识计数值,请改⽤ DELETE。
如果要删除表定义及其数据,请使⽤ DROP TABLE 语句。
--------------------------------------------------------------------------------------
以上只是介绍⼀下两个命令的⽤法,下⾯说⼀下我的推荐⽤法,truncate命令速度快,占⽤资源少,如果你能确定当前表⾥的数据完全没有⽤的话可以使⽤此命令,⽅⾯快捷,如果数据或许有⽤,那你最好做好备份,否则⼀旦使⽤此命令,就悔不当初了,当然delete命令还是有好处的,如果不能保证此后的数据有不有⽤,但是当前不知道,或者⼲脆就是误删了,那么使⽤rollback命令直接回滚,当然rollback命令可以添加回滚点,定位回滚,恢复数据⽐较⽅便,所以说对与初学者,楼主强烈建议⼤家删除数据时使⽤delete命令,⿇烦事⿇烦了点,但是保险⼀点,这是我的教训啊,误⽤truncate命令清空了⼀个表,还好这个表是⽆关紧要的,否则我就只有以谢天下了。当然,⾮常强烈的建议是,做任何操作前,对于有⽤的数据都要事先备份,不管⽤不⽤得着,有备⽆患。