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

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

Wiki / SQL 命令

TRUNCATE

清空一个表或一组表

英文手册覆盖始于 PostgreSQL 6.4. 来源历史与运行验证各自保留独立版本边界。

当前阅读 PG 18·选择有来源记录的版本

anchor
SQL-TRUNCATE
file
sql-truncate.html
lang
en
name
TRUNCATE
purpose
empty a table or set of tables
purpose zh
未知
sections same as
未知
slug
18
synopsis html
TRUNCATE [ TABLE ] [ ONLY ] <em class="replaceable"><code>name</code></em> [ * ] [, ... ] [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
synopsis text
TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ] [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]

语法

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

从左向右阅读;分支表示选择,旁路表示可选,循环表示重复。点击带下划线的参数可打开对应规则。

TRUNCATE TABLE ONLY name * , RESTART IDENTITY CONTINUE IDENTITY CASCADE RESTRICT

版本定义 PG 18

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.6 节。

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

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

如果外部数据包装器支持,TRUNCATE也可以用于外部表,例如参见postgres_fdw。

示例

截断表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

比较版本

来源引用

完整定义与证据 JSON

定义来源

center · PostgreSQL 18 · a709ab85

正文语言: zh-Hans · 1b5ca64c