TRUNCATE 语句

使用 TRUNCATE 语句来快速地从本地表删除所有行,并释放相关联的存储空间。您可可选地为同一表及其索引保留该空间。仅 GBase 8s 支持 TRUNCATE 语句的此实现,这是对 SQL 的 ANSI/ISO 标准的扩展。

语法

元素 描述 限制 语法
owner tablesynonym 的所有者 请参阅用法说明。 所有者名称
synonym 要从其移除所有数据的表的同义词 必须存在,且必须未设置 USETABLENAME 标识符
table 从其移除所有数据和它的索引的所有 B 树结构的表名称 必须在数据库中存在 标识符

用法

TRUNCATE 语句快速地从本地表删除所有活动的数据行和表上索引的 B 树结构。您有释放由行和索引 extent 占据的存储空间的选项,或当随后以新的行重新植入该表时重用相同的空间。

要执行 TRUNCATE 语句,必须满足下列条件中至少一条:
  • 您是该表的所有者。
  • 您在该表上持有 Delete 访问权限。
  • 您在当前的数据库上持有 DBA 访问权限。
如果在该表上定义启用的 Delete 触发器,则您还必须在该表上持有 Alter 权限,即使 TRUNCATE 语句不激活触发器。

对于不拥有该表的非 DBA 用户,虽然要求有 Delete 权限,但 TRUNCATE 是数据定义语言(DDL)语句。像其他 DDL 语句一样,TRUNCATE 不可在您连接到的数据库之外的任何表上操作,也不可在并发会话正在以 Dirty Read 隔离模式读取的表上操作。

GBase 8s 总是记录 TRUNCATE 操作日志,即使是对于无日志记录的表。在支持会话日志记录的数据库中,在同一事务之内的 TRUNCATE 语句之后,仅 SQL 的 COMMIT WORK 或 ROLLBACK WORK 语句是有效的。在此,ROLLBACK 语句必须取消包括 TRUNCATE 语句的整个事务。如果 ROLLBACK TO SAVEPOINT(或除了不带有 TO SAVEPOINT 子句的 COMMIT WORK 或 ROLLBACK WORK 之外的任何其他 SQL 语句)紧跟在 TRUNCATE 语句之后,则 GBase 8s 发出错误。

当您成功地回滚 TRUNCATE 语句时,不从该表移除任何行,且持有这些行和索引分区的存储 extent 会被分配给该表。仅带有事务日志记录的数据库可支持 ROLLBACK WORK 语句。

在 TRUNCATE 语句成功地执行之后, GBase 8s 自动地为该表及其在系统目录中的索引更新统计信息和分发,来展示在该表中没有行,在它的 dbspace 分区中也没有行。不必在您提交 TRUNCATE 语句之后立即运行 UPDATE STATISTICS 语句。

如果 TRUNCATE 语句指定的表是 typed 表,则成功的 TRUNCATE 操作从那个表和从表层级内所有的它的子表移除所有行和 B 树结构。

TRUNCATE 语句不重置 SERIAL、BIGSERIAL 或 SERIAL8 列的序列值。要重置序列列的计数器,请使用 ALTER TABLE 语句的 MODIFY 子句,在您执行 TRUNCATE 语句之前或之后都可以。