2024 年 9 月 26 日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本: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

TRUNCATE

TRUNCATE — 清空一个或多个表

语法

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

描述

TRUNCATE 快速删除一组表中的所有行。它与对每个表执行无限定的 DELETE 效果相同,但由于它不会实际扫描表,因此速度更快。此外,它会立即回收磁盘空间,而不需要后续的 VACUUM 操作。这在大型表上非常有用。

参数

name

要截断的表的名称(可选的模式限定)。如果在表名前指定了 ONLY,则只截断该表。如果未指定 ONLY,则会截断该表及其所有子表(如果有)。可选地,可以在表名后指定 * 以明确指示包含子表。

RESTART IDENTITY

自动重启被截断表(s)的列所拥有的序列。

CONTINUE IDENTITY

不要更改序列的值。这是默认值。

CASCADE

自动截断所有具有对任何命名表的或由于 CASCADE 添加到组中的任何表的外部键引用的表。

RESTRICT

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

备注

您必须具有表的 TRUNCATE 权限才能截断它。

TRUNCATE 在其操作的每个表上获取一个 ACCESS EXCLUSIVE 锁,这会阻止对该表的所有其他并发操作。当指定了 RESTART IDENTITY 时,任何要重启的序列也会被独占锁定。如果需要对表进行并发访问,则应使用 DELETE 命令。

TRUNCATE 不能用于具有来自其他表的外部键引用的表,除非所有这些表也在同一个命令中被截断。在这种情况下,检查有效性需要表扫描,而重点是不执行扫描。可以使用 CASCADE 选项自动包含所有依赖表——但在使用此选项时要非常小心,否则可能会丢失您不希望丢失的数据!特别要注意,当要截断的表是一个分区时,兄弟分区将保持不变,但级联将发生在所有引用表及其所有分区中,没有区别。

TRUNCATE 不会触发可能存在于这些表的任何 ON DELETE 触发器。但它会触发 ON TRUNCATE 触发器。如果为任何表定义了 ON TRUNCATE 触发器,则在发生任何截断之前会触发所有 BEFORE TRUNCATE 触发器,并且在执行最后一个截断和重置任何序列之后会触发所有 AFTER TRUNCATE 触发器。触发器将按照要处理表的顺序触发(首先是命令中列出的那些,然后是由于级联而添加的那些)。

TRUNCATE 不是 MVCC 安全的。截断后,如果并发事务使用在截断发生之前拍摄的快照,则该表将对这些事务显示为空。有关更多详细信息,请参阅 第 13.6 节

TRUNCATE 对表中的数据是事务安全的:如果周围的事务未提交,则截断将安全回滚。

当指定了 RESTART IDENTITY 时,隐含的 ALTER SEQUENCE RESTART 操作也会以事务方式完成;也就是说,如果周围的事务未提交,它们将被回滚。请注意,如果在事务回滚之前对已重启的序列执行了任何其他序列操作,这些操作对序列的影响将被回滚,但它们对 currval() 的影响不会被回滚;也就是说,在事务之后,currval() 将继续反映在失败的事务中获得的最后一个序列值,即使序列本身可能不再与该值一致。这类似于失败事务后 currval() 的通常行为。

TRUNCATE 可用于外部表,如果外部数据包装器支持,例如,请参阅 postgres_fdw

示例

截断表 bigtablefattable

TRUNCATE bigtable, fattable;

同样,并重置任何相关的序列生成器

TRUNCATE bigtable, fattable RESTART IDENTITY;

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

TRUNCATE othertable CASCADE;

兼容性

SQL:2008 标准包含一个语法为 TRUNCATE TABLE tablenameTRUNCATE 命令。CONTINUE IDENTITY/RESTART IDENTITY 子句也出现在该标准中,但含义略有不同,但相关。此命令的一些并发行为由标准留作实现定义,因此如有必要,应考虑上述说明并与其他实现进行比较。

另请参阅

DELETE

提交更正

如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符或需要进一步澄清,请使用 此表格 报告文档问题。