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
子句也出现在该标准中,但含义略有不同但相关。该命令的一些并发行为在标准中被留给实现定义,因此如果需要,应考虑上述注意事项并与其他实现进行比较。
如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 来报告文档问题。