On this page
TRUNCATE
TRUNCATE —清空一个表或一组表
Synopsis
TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ]
[ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
Description
TRUNCATE
快速从一组表中删除所有行。它具有与每个表上不合格DELETE
相同的效果,但是由于它实际上并未扫描表,因此速度更快。此外,它会立即回收磁盘空间,而不需要随后的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
触发器将在执行最后一个截断并重置任何序列后触发。触发器将按照要处理表的 Sequences 触发(首先是命令中列出的那些,然后是由于级联而添加的任何触发器)。
TRUNCATE
不是 MVCC 安全的。截断后,如果并发事务使用截断发生之前拍摄的快照,则该表将对并发事务显示为空。有关更多详细信息,请参见Section 13.5。
TRUNCATE
对于表中的数据是事务安全的:如果周围的事务未提交,则截断将被安全地回滚。
当指定RESTART IDENTITY
时,隐含的ALTER SEQUENCE RESTART
操作也会以事务方式完成;也就是说,如果周围的事务没有提交,它们将被回滚。这与ALTER SEQUENCE RESTART
的正常行为不同。请注意,如果在事务回滚之前对重新启动的序列执行了任何其他序列操作,则这些操作对序列的影响将被回滚,但不会对currval()
产生影响。也就是说,在事务currval()
之后将 continue 反映在失败的事务中获得的最后一个序列值,即使序列本身可能不再与此一致。这类似于事务失败后currval()
的通常行为。
外部表当前不支持TRUNCATE
。这意味着,如果指定的表具有外部的任何后代表,则该命令将失败。
Examples
截断表bigtable
和fattable
:
TRUNCATE bigtable, fattable;
相同,并重置所有关联的序列生成器:
TRUNCATE bigtable, fattable RESTART IDENTITY;
截断表othertable
,并通过外键约束级联到引用othertable
的任何表:
TRUNCATE othertable CASCADE;
Compatibility
SQL:2008 标准包括带有语法TRUNCATE TABLE tablename
的TRUNCATE
命令。 CONTINUE IDENTITY
/RESTART IDENTITY
子句也出现在该标准中,但尽管具有相关含义,但也略有不同。该命令的某些并发行为由标准实现定义,因此应考虑上述注意事项,并在必要时与其他实现进行比较。