TRUNCATE — 清空一个或一组表
TRUNCATE [ TABLE ] [ ONLY ] name
[ * ] [, ... ]
[ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
TRUNCATE
快速移除一组表中的所有行。它与对每个表执行无条件 DELETE
具有相同的效果,但因为它实际上不扫描表,所以速度更快。此外,它会立即回收磁盘空间,而不是需要后续的 VACUUM
操作。这对于大型表来说最有用。
name
要截断的表的名称(可选地带有模式限定)。如果在表名称之前指定了 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。
截断表 bigtable
和 fattable
TRUNCATE bigtable, fattable;
相同,并且重置任何关联的序列生成器
TRUNCATE bigtable, fattable RESTART IDENTITY;
截断表 othertable
,并级联到任何通过外键约束引用 othertable
的表
TRUNCATE othertable CASCADE;
SQL:2008 标准包含一个 TRUNCATE
命令,语法为 TRUNCATE TABLE
。tablename
CONTINUE IDENTITY
/RESTART IDENTITY
子句也出现在该标准中,但具有略有不同但相关的含义。该标准将此命令的某些并发行为留给实现定义,因此应考虑上述说明,并在必要时与其他实现进行比较。
如果您在文档中看到任何不正确、与您使用特定功能的体验不符或需要进一步澄清的内容,请使用此表单来报告文档问题。