↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0
历史版本。 PostgreSQL 10 已结束支持。 2022-11-10. 请参阅 当前版本手册.

TRUNCATE

TRUNCATE — 清空一个表或一组表

大纲

TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ]
    [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]

描述

TRUNCATE 可以快速移除一组表中的所有行。它的效果与对每个表执行不带条件的 DELETE 相同,但由于它并不实际扫描这些表,因此速度更快。此外,它会立即回收磁盘空间,而不是要求后续再执行一次 VACUUM 操作。这一点对于大表尤其有用。

参数

name

要截断的表名(可以是模式限定的)。如果在表名前指定了 ONLY,则只截断该表。如果未指定 ONLY,则该表及其所有后代表(如果有)都会被截断。也可以在表名后指定 *,以显式表明包含后代表。

RESTART IDENTITY

自动重新启动由被截断表列拥有的 sequence。

CONTINUE IDENTITY

不更改 sequence 的值。这是默认值。

CASCADE

自动截断所有通过外键引用指定表的表,以及通过外键引用因 CASCADE 而加入截断范围的表的其他表。

RESTRICT

如果任一表具有来自命令中未列出表的外键引用,则拒绝截断。这是默认值。

注解

要截断一个表,你必须拥有该表上的 TRUNCATE 权限。

TRUNCATE 会在其操作的每个表上获取 ACCESS EXCLUSIVE 锁,这会阻塞该表上的所有其他并发操作。当指定 RESTART IDENTITY 时,任何需要重新启动的 sequence 也会同样被排他锁定。如果需要对某个表进行并发访问,则应改用 DELETE 命令。

TRUNCATE 不能用于被其他表通过外键引用的表,除非所有这类表也在同一条命令中被截断。因为在这种情况下检查有效性将需要扫描表,而该命令的意义恰恰在于避免这样做。CASCADE 选项可用于自动包含所有依赖表 — 但使用该选项时一定要非常小心,否则你可能会丢失并非有意删除的数据!

TRUNCATE 不会引发这些表上可能存在的任何 ON DELETE 触发器,但会引发 ON TRUNCATE 触发器。如果这些表中的任何一个定义了 ON TRUNCATE 触发器,那么所有 BEFORE TRUNCATE 触发器都会在任何截断发生之前引发,而所有 AFTER TRUNCATE 触发器都会在最后一次截断完成且所有 sequence 被重置之后引发。触发器会按照表的处理顺序引发(先是命令中列出的表,然后是由于级联而加入的表)。

TRUNCATE 不是多版本并发控制(MVCC)安全的。截断之后,如果并发事务使用的是在截断发生前取得的快照,该表对这些并发事务而言将表现为空。详见第 13.5 节。

就表中数据而言,TRUNCATE 是事务安全的:如果外围事务没有提交,截断将被安全地回滚。

当指定 RESTART IDENTITY 时,隐含的 ALTER SEQUENCE RESTART 操作也会以事务方式执行;也就是说,如果外围事务没有提交,它们也会被回滚。请注意,如果在事务回滚前又对这些重启后的 sequence 执行了额外操作,这些操作对 sequence 本身的影响会被回滚,但对 currval() 的影响不会被回滚。也就是说,事务结束后,currval() 仍将反映失败事务内取得的最后一个 sequence 值,即使 sequence 本身可能已经不再与之保持一致。这与失败事务之后 currval() 的通常行为类似。

目前,TRUNCATE 不支持外部表。这意味着,如果指定表的后代表中有外部表,该命令就会失败。

示例

截断表 bigtable 和 fattable:

TRUNCATE bigtable, fattable;

同样的操作,并重置所有相关联的 sequence 生成器:

TRUNCATE bigtable, fattable RESTART IDENTITY;

截断表 othertable,并级联到任何通过外键约束引用 othertable 的表:

TRUNCATE othertable CASCADE;

兼容性

SQL:2008 标准包括了一个 TRUNCATE 命令,语法是 TRUNCATE TABLE tablename。子句 CONTINUE IDENTITY/RESTART IDENTITY 在该标准中也有出现,但其含义虽相关却略有不同。该命令的某些并发行为在标准中被留作实现定义,因此必要时应结合上述注解并与其他实现进行比较。

另见

DELETE

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.