Postgresql 中文操作指南

TRUNCATE

TRUNCATE — 清空一个表或一组表

Synopsis

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

Description

TRUNCATE 快速地从一组表中删除所有行。它对每个表都有相同的效果,但由于它实际上并没有扫描表,因此它更快。此外,它会立即回收磁盘空间,而不是需要后续的 VACUUM 操作。这在大型表上是最有用的。

Parameters

  • name

    • 要清空的表的名字(可选择模式限定)。如果 ONLY 指定在表名前面,则只会清空该表。如果 ONLY 没有指定,则会清空该表及其所有子表(如果有)。可选择在表名后指定 * ,以明确表示包含子表。

  • RESTART IDENTITY

    • 自动重新启动被清空表的列所拥有的序列。

  • CONTINUE IDENTITY

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

  • CASCADE

    • 自动清空所有对其中任何命名的表或由于 CASCADE 而添加到组中的任何表的具有外键引用的表。

  • RESTRICT

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

Notes

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

TRUNCATE 会获取它操作的每个表上的 ACCESS EXCLUSIVE 锁,它会阻塞表上的所有其他并发操作。当指定 RESTART IDENTITY 时,将要重新启动的所有序列也会被锁定。如果需要并发访问表,则应使用 DELETE 命令。

TRUNCATE 不能用于具有来自其他表的外部键引用的表,除非同时也在同一命令中截断了所有此类表。在这种情况下检查有效性将需要扫描表,而我们的目标是避免这样做。 CASCADE 选项可用于自动包含所有从属表——但在使用此选项时要非常小心,否则您可能会丢失不想丢失的数据!特别注意,当要截断的表是一个分区时,同级分区不会受到任何影响,但连锁会发生在所有引用表及其所有分区上,没有任何区别。

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

TRUNCATE 不是 MVCC 安全的。截断后,如果他们使用在截断之前拍摄的快照,对于并发事务,表将显示为空。有关更多详细信息,请参见 Section 13.6

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

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

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

Examples

删减表@ {s0} 和 @ {s1}:

TRUNCATE bigtable, fattable;

同样地,重置任何关联的序列发生器:

TRUNCATE bigtable, fattable RESTART IDENTITY;

删减表@ {s2},并级联到通过外键约束引用 @ {s3} 的任何表:

TRUNCATE othertable CASCADE;

Compatibility

SQL:2008 标准包括具有语法 @ {s5} 的 TRUNCATE 命令。从句 @ {s6}/ RESTART IDENTITY 也出现在该标准中,但具有略有不同的相关含义。该命令的某些并发行为由标准定义为实现,因此,如果需要,应考虑上述注意事项并将其与其他实现进行比较。

See Also