Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

TRUNCATE

TRUNCATE——清空表格或表格组

概要

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

描述

TRUNCATE迅速从表格组中移除所有行。其作用与对各个表格执行不限定的DELETE一样,但由于它实际上不会扫描表格,因此速度较快。此外,它会立即回收磁盘空间,而无需执行后续VACUUM操作。这在大表格中特别有用。

参数

名称

将要截断的表(可选的 schema 限定)名称。如果在表名称前指定 ONLY,则只截断该表。如果未指定 ONLY,则将截断该表及其所有后代表(如果有)。此外,可以在表名称之后指定 *,明确指明包含后代表。

RESTART IDENTITY

自动重启被截断表的列拥有的序列。

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