选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.0 已于 2015 年 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锁,这会阻塞该表上所有其他并发操作。如果需要对一个表进行并发访问,则应改用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操作都是非事务性的,失败时不会被回滚。为了把风险降到最低,这些操作只在TRUNCATE的所有其余工作完成之后才执行。不过,如果TRUNCATE在一个随后被中止的事务块内执行,仍然存在风险。例如,考虑

BEGIN;
TRUNCATE TABLE foo RESTART IDENTITY;
COPY foo FROM ...;
COMMIT;

如果COPY中途失败,表数据会正确回滚,但序列将保留可能比之前更小的值,这可能导致后续事务中出现重复键失败或其他问题。如果这很可能成为问题,最好避免使用RESTART IDENTITY,并接受表的新内容比旧内容具有更高序列号的事实。

示例

截断表bigtablefattable

TRUNCATE bigtable, fattable;

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

TRUNCATE bigtable, fattable RESTART IDENTITY;

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

TRUNCATE othertable CASCADE;

兼容性

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

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。