第19章 SQL语句:TRUNCATE TABLE

本文介绍了如何使用TRUNCATETABLE语句在Oracle数据库中高效删除表,包括其与DELETE语句的区别、操作流程、注意事项及限制条件。通过实例演示了如何执行截断表的操作,同时解释了截断表后对索引、存储参数的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作用

使用TRUNCATE TABLE语句可以删除表中的所有行。默认情况下,Oracle数据库还会执行以下操作:

  • 释放被删除行占用的全部空间,保留存储参数MINEXTENTS指定的空间
  • 将NEXT存储参数设置为段中最后被删除的区间的大小

注意:无法回滚TRUNCATE TABLE语句,也不能使用FLASHBACK TABLE语句检索到被截断表的数据。

使用TRUNCATE TABLE语句删除行比删除并重建表更高效。删除并重建表会使依赖该表的对象变得无效,需要重新授予该表上的对象权限,并且需要重新创建该表的索引、完整性约束以及触发器,以及为它重新指定存储参数。截断表没有这些影响。

使用TRUNCATE TABLE语句删除行比使用DELETE语句删除所有行更快,尤其是存在多个触发器、所有以及其他约束的表。

前提条件

要截断一个表,该表必须位于当前用户的模式中,或者拥有DROP ANY TABLE系统权限。

语法

truncate_table::=

bb

语义

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

fj.pngtruncate_table.gif

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

转载于:http://blog.itpub.net/24945919/viewspace-768116/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值