本节书摘来自异步社区出版社《Oracle SQL疑难解析》一书中的第1章,第1.10节,作者: 【美】Grant Allen , Bob Bryla , Darl Kuhn,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.10 删除表中的所有行
Oracle SQL疑难解析
1.10.1 要解决的问题
从指定的表中删除所有数据。
1.10.2 解决方法
如果用DELETE语句来删除所有行,则Oracle会完整地把删除行为记入日志,以便如果是误操作,我们还有机会将数据回滚。但正是因为要记日志,所以需要花一定的时间,有时达不到我们希望的速度。
作为补充,Oracle提供了一个TRUNCATE(截断)语句来删除表中的所有数据。可以用下面的语句来截断HR.EMPLOYEES表:
truncate table hr.employees;
1.10.3 数据库如何工作
TRUNCATE语句不带WHERE子句或其他限制条件。TRUNCATE语句的处理是按DDL(Data Definition Language,数据定义语言)的方式,因此同时也隐含了数据库的一些操作,如隐式地提交其他open事务。第9章有关于事务控制和监控更详细的讲解。
TRUNCATE命令也将重置表的高水位标志(high-water mark),当Oracle进行优化分析时需要统计表的已使用容量,重置高水位标志意味着Oracle认为表从未有过数据,也没占据过空间。