作用
使用TRUNCATE TABLE语句可以删除表中的所有行。默认情况下,Oracle数据库还会执行以下操作:
- 释放被删除行占用的全部空间,保留存储参数MINEXTENTS指定的空间
- 将NEXT存储参数设置为段中最后被删除的区间的大小
注意:无法回滚TRUNCATE TABLE语句,也不能使用FLASHBACK TABLE语句检索到被截断表的数据。
使用TRUNCATE TABLE语句删除行比删除并重建表更高效。删除并重建表会使依赖该表的对象变得无效,需要重新授予该表上的对象权限,并且需要重新创建该表的索引、完整性约束以及触发器,以及为它重新指定存储参数。截断表没有这些影响。
使用TRUNCATE TABLE语句删除行比使用DELETE语句删除所有行更快,尤其是存在多个触发器、所有以及其他约束的表。
前提条件
要截断一个表,该表必须位于当前用户的模式中,或者拥有DROP ANY TABLE系统权限。
语法
truncate_table::=
语义
TABLE从句
指定要截断的表的模式和名称。该表不能是簇表的一部分。如果忽略schema,假设该表位于当前模式。
- 可以截断索引组织表和临时表。截断临时表时,只删除当前会话创建的行。
- Oracle将table的NEXT存储参数修改为段中最后被删除的区间的大小。
- Oracle自动截断并重置table上的UNUSABLE的以下索引:局部索引的范围分区和哈希分区,以及局部索引的子分区。
- 如果table不为空,数据库将表上的所有非分区索引和全局分区索引的所有分区标记为UNUSABLE。但是,当表被截断时,索引也被截断,并为索引段计算一个新的高水位线。这个操作相当于创建了一个新的索引段。因此,在截断操作结束后,索引再次变成USABLE。
- 对于域索引,该语句将会调用适当的截断程序截断域索引数据。
- 如果一个常规表或者索引组织表包含LOB列,将会截断所有的LOB数据段和LOB索引段。
- 如果table是分区表,将会截断所有的分区或者子分区,以及分区或子分区的LOB数据段和LOB索引段。
- 所有的游标将会无效。
注释:截断表时,Oracle自动删除表的索引数据和与表关联的物化视图的直接路径INSERT信息。这个信息与任何的物化视图日志无关。如果删除了直接路径INSERT信息,物化视图的增量刷新可能丢失数据。
截断表的限制
该语句存在以下限制:
- 不能回滚TRUNCATE TABLE语句。
- 不能闪回到表被截断之前的状态。
- 不能截断属于簇表一部分的单个表。只能截断簇表、删除单个表的全部行或者删除并重建单个表。
- 不能删除一个启动外键约束的父表。必须在截断表之前禁用该约束。自我参考的完整性约束除外。
- 如果table存在域索引,该索引或者索引分区都不能被标记为IN_PROCESS。
- 不能截断引用分区表的父表。必须先删除引用分区子表。
MATERIALIZED VIEW LOG从句
4
STORAGE从句
6
7
示例
示例一:截断表
以下语句删除
1
示例二:阶段后保留物化视图日志
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24945919/viewspace-768116/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24945919/viewspace-768116/