ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 第19章 SQL语句:TRUNCATE TABLE

第19章 SQL语句:TRUNCATE TABLE

原创 Linux操作系统 作者:BUAA_dxy 时间:2013-08-09 10:49:05 0 删除 编辑

作用

使用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

truncate_table.gif

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24945919/viewspace-768116/,如需转载,请注明出处,否则将追究法律责任。

上一篇: MySQL 5.6 复制介绍
请登录后发表评论 登录
全部评论

注册时间:2010-11-19

  • 博文量
    104
  • 访问量
    290320