# 截短

TRUNCATE — 清空一个表或一组表

# 概要

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

# 描述

截短从一组表中快速删除所有行。和不合格的效果一样删除在每个表上,但由于它实际上并不扫描表,因此速度更快。此外,它会立即回收磁盘空间,而不需要后续的真空手术。这在大表上最有用。

# 参数

姓名

要截断的表的名称(可选模式限定)。如果只要在表名之前指定,只有该表被截断。如果只要如果未指定,则该表及其所有后代表(如果有)将被截断。可选地,*可以在表名之后指定以明确指示包含后代表。

重新开始身份

自动重新启动截断表的列所拥有的序列。

继续身份

不要更改序列的值。这是默认设置。

级联

自动截断所有具有对任何命名表或添加到组中的表的外键引用的表,因为级联.

严格

如果任何表具有来自命令中未列出的表的外键引用,则拒绝截断。这是默认设置。

# 笔记

你必须拥有截短对表进行截断的特权。

截短获得一个访问独家锁定它操作的每个表,这会阻止该表上的所有其他并发操作。什么时候重新开始身份被指定时,任何要重新启动的序列同样被排他地锁定。如果需要同时访问一个表,那么删除应改为使用命令。

截短不能在具有来自其他表的外键引用的表上使用,除非所有此类表也在同一命令中被截断。在这种情况下检查有效性将需要表扫描,而重点不是这样做。这级联选项可用于自动包含所有依赖表 - 但使用此选项时要非常小心,否则您可能会丢失您不打算丢失的数据!特别注意,当要截断的表是一个分区时,兄弟分区保持不变,但所有引用表及其所有分区都会发生级联,没有区别。

截短不会开火删除时表中可能存在的触发器。但是会火截断触发器。如果截断触发器是为任何表定义的,然后所有截断前在任何截断发生之前触发触发器,并且所有截断后在执行最后一次截断并重置任何序列后触发触发器。触发器将按照要处理的表的顺序触发(首先是命令中列出的那些,然后是由于级联而添加的任何表)。

截短不是 MVCC 安全的。截断后,如果并发事务使用截断发生之前拍摄的快照,表将显示为空。看第 13.5 节更多细节。

截短对于表中的数据是事务安全的:如果周围的事务没有提交,截断将被安全地回滚。

什么时候重新开始身份是指定的,隐含的改变序列重启操作也是事务性的;也就是说,如果周围的事务没有提交,它们将被回滚。请注意,如果在事务回滚之前对重新启动的序列进行了任何额外的序列操作,则这些操作对序列的影响将被回滚,但它们对曲线();也就是交易之后曲线()将继续反映在失败事务中获得的最后一个序列值,即使序列本身可能不再与之一致。这类似于通常的行为曲线()交易失败后。

截短如果外部数据包装器支持,可以用于外部表,例如,请参阅postgres_fdw.

# 例子

截断表格大表胖胖的

TRUNCATE bigtable, fattable;

同样,也重置任何关联的序列生成器:

TRUNCATE bigtable, fattable RESTART IDENTITY;

截断表格其他表, 并级联到任何引用的表其他表通过外键约束:

TRUNCATE othertable CASCADE;

# 兼容性

SQL:2008 标准包括一个截短命令的语法截断表 *表名*.条款继续身份/重新开始身份也出现在该标准中,但尽管相关含义略有不同。该命令的一些并发行为是由标准实现定义的,因此应考虑上述注意事项,并在必要时与其他实现进行比较。

# 也可以看看

删除