TRUNCATE 语句

TRUNCATE 语句从表中删除所有行。

调用

此语句可以嵌入在应用程序中,也可通过动态 SQL 语句来发出。 它是一个可执行语句,仅当 DYNAMICRULES 运行行为对于程序包有效时才能动态编译 (SQLSTATE 42509)。

权限

该语句的授权标识所拥有的特权必须至少包含下列其中一个对该表的权限,以及表层次结构的所有子表的权限:
  • 要截断的表的 DELETE 特权
  • 对包含该表的模式的 DELETEIN 特权
  • 要截断的表的 CONTROL 特权
  • 对包含该表的模式的 DATAACCESS 权限
  • DATAACCESS 权限
要忽略对该表定义的任何 DELETE 触发器,该语句的授权标识所拥有的特权必须至少包含对该表的下列其中一个权限以及表层次结构的所有子表:
  • 对表的 ALTER 特权
  • 对包含表和表层次结构的所有子表的模式的 ALTERIN 特权
  • 对表的 CONTROL 特权
  • 对包含表和表层次结构的所有子表的模式的 SCHEMAADM 权限
  • DBADM 权限
要截断受安全策略保护的表,该语句的授权标识所拥有的特权必须至少包含下列其中一项权限:
  • 对表的 CONTROL 特权
  • DBADM 权限
要截断激活了行访问控制的表,该语句的授权标识必须至少包含下列其中一个权限:
  • 对表的 CONTROL 特权
  • DBADM 权限

语法

Read syntax diagramSkip visual syntax diagram TRUNCATE TABLE table-name DROP STORAGEREUSE STORAGE IGNORE DELETE TRIGGERSRESTRICT WHEN DELETE TRIGGERS CONTINUE IDENTITY IMMEDIATE1
Notes:
  • 1 IMMEDIATE is optional only for column-organized tables.

描述

table-name
标识要截断的表。 该名称必须标识存在于当前服务器上的表 (SQLSTATE 42704),但它不能是目录表 (SQLSTATE 42832)、昵称 (SQLSTATE 42809)、视图、子表、登台表、系统维护的具体化查询表系统周期时态表 (SQLSTATE 428HZ) 或范围集群表 (SQLSTATE 42807)。

如果 table-name 是表层次结构的根表,那么表层次结构中的所有表都将被截断。

DROP STORAGE 或 REUSE STORAGE
指定是删除还是复用已分配给该表的现有存储器。 缺省值为 DROP STORAGE。
DROP STORAGE
分配给该表的所有存储器都已释放并且可用。 如果指定了此选项(隐式或显式),那么将阻止联机备份。
REUSE STORAGE
分配给该表的所有存储器将继续分配给该表,但该存储器将被视为空。 此选项仅适用于 DMS 表空间中的表,否则将被忽略。
IGNORE DELETE TRIGGERS 或 RESTRICT WHEN DELETE TRIGGERS
指定在表上定义删除触发器时要执行的操作。 缺省值为 IGNORE DELETE TRIGGERS。
IGNORE DELETE TRIGGERS
截断操作不会激活对该表定义的任何删除触发器。
RESTRICT WHEN DELETE TRIGGERS
如果对表定义了删除触发器,那么会返回错误 (SQLSTATE 428GJ)。
CONTINUE IDENTITY
如果存在该表的标识列,那么生成的下一个标识列值将继续使用如果未执行 TRUNCATE 语句就会生成的下一个值。
IMMEDIATE
指定立即处理截断操作,并且无法撤销该操作。 该语句必须是事务中的第一个语句 (SQLSTATE 25001)。

截断的表立即可用于同一工作单元。 虽然允许在 TRUNCATE 语句后执行 ROLLBACK 语句,但截断操作不会撤销,并且该表将保持截断状态。 例如,如果在 TRUNCATE IMMEDIATE 语句之后对该表执行另一个数据更改操作,然后执行 ROLLBACK 语句,那么将不会撤销截断操作,但所有其他数据更改操作都将撤销。

规则

  • 引用完整性:在强制引用约束 (SQLSTATE 428GJ) 中,表和表层次结构中的所有表都不能是父表。 允许使用自引用的 RI 约束。
  • 分区表:由于已更改为连接数据分区,因此该表不能处于设置完整性暂挂状态 (SQLSTATE 55019)。 在执行 TRUNCATE 语句之前,需要检查该表的完整性。 该表不得具有任何逻辑上已拆离的分区 (SQLSTATE 55057)。 在执行 TRUNCATE 语句之前,异步分区拆离任务必须完成。
  • 互斥存取:任何其他会话都不能对该表打开游标,也不能对该表挂起锁定 (SQLSTATE 25001)。
  • WITH HOLD 游标:当前会话不能对该表打开 WITH HOLD 游标 (SQLSTATE 25001)。

注意

  • 表统计信息:TRUNCATE 语句不会更改该表的统计信息。
  • 已删除的行数: SQLERRD(3) 在 SQLCA 中设置为 -1,对于截断操作。 未返回已从表中删除的行数。

示例

  • 示例 1:清空未使用的库存表,而不考虑任何现有触发器,并返回其分配的空间。
       TRUNCATE TABLE INVENTORY
         IGNORE DELETE TRIGGERS
         DROP STORAGE
         IMMEDIATE
  • 示例 2:清空未使用的库存表,而不考虑任何现有删除触发器,但保留其分配的空间以供将来复用。
       TRUNCATE TABLE INVENTORY
          REUSE STORAGE
          IGNORE DELETE TRIGGERS
          IMMEDIATE