TRUNCATE
TRUNCATE — 清空表或一组表
语法
TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ]
[ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
描述
TRUNCATE
快速删除一组表中的所有行。它与对每个表执行不限定的DELETE
效果相同,但由于它实际上不会扫描表,因此速度更快。此外,它会立即回收磁盘空间,而不需要后续的VACUUM
操作。这在大型表上最有用。
参数
name
要截断的表的名称(可选的架构限定)。如果在表名前指定
ONLY
,则只截断该表。如果未指定ONLY
,则截断该表及其所有后代表(如果有)。另外,可以在表名后指定*
以明确表示包括后代表。重新启动标识
自动重新启动被截断表的列所拥有的序列。
继续标识
不更改序列的值。这是默认值。
级联
自动截断所有对任何指定表或由于
CASCADE
而添加到该组的任何表具有外键引用的表。限制
如果任何表具有未在命令中列出的表的外部键引用,则拒绝截断。这是默认值。
注释
您必须对表具有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
也出现在该标准中,但具有稍有不同的相关含义。该命令的某些并发行为由标准定义为实现定义的,因此如有必要,应考虑上述说明并与其他实现进行比较。