使用 TRUNCATE 语句来快速地从本地表删除所有行,并释放相关联的存储空间。您可可选地为同一表及其索引保留该空间。仅 GBase 8s 支持 TRUNCATE 语句的此实现,这是对 SQL 的 ANSI/ISO 标准的扩展。
TRUNCATE 语句快速地从本地表删除所有活动的数据行和表上索引的 B 树结构。您有释放由行和索引 extent 占据的存储空间的选项,或当随后以新的行重新植入该表时重用相同的空间。
对于不拥有该表的非 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 语句之前或之后都可以。