TRUNCATE

Name

TRUNCATE -- 清空一个组或者一组表

Synopsis

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

描述

TRUNCATE快速地从一堆表中删除所有行。它和在每个 表上进行无条件的DELETE有同样的效果,不过因为它 不做表扫描,因而快得多。在大表上最有用。

参数

name

要清空的表名字(可以有模式修饰)。如果声明ONLY,只有 那个表会被清空。如果没有声明ONLY,这个表以及其所有子 表(若有)会被清空。

RESTART IDENTITY

Warning

自动重启被清空的列的序列。

CONTINUE IDENTITY

Warning

不要改变序列的缺省值。此为缺省。

CASCADE

级联清空所有在该表上有外键引用的表,或者由于CASCADE 而被添加到组中的表。

RESTRICT

如果其他表在该表上有外键引用则拒绝清空。此为缺省。

注意

你必须对表有TRUNCATE以清空它。

TRUNCATE取得了一个其操作的每个表上的ACCESS EXCLUSIVE锁, 这阻塞了表上的所有其他并发操作。如果请求对一个表的并发访问,那么反而应该使用DELETE 命令。

TRUNCATE不能用于有参照其他表的外键的表,除非所有这些表也在相同的命令中 被缩短。在这种情况下检查有效性需要扫描表,并且整个点不会做一个。CASCADE 选项可以用于自动包括所有依赖表—但在使用该选项时会非常有用,否则你可能会失去你 您不想要的数据!

TRUNCATE不会触发人任何可能为表存在的ON DELETE触发器。 但它会触发ON TRUNCATE触发器。如果ON TRUNCATE触发器 为任何表定义,然后所有的BEFORE TRUNCATE触发器会在任何事物发生之前 触发,并且所有AFTER TRUNCATE触发器会在最后一个事务执行后被触发。 该触发器会以表执行的顺序触发(首先是命令中列出的,然后是任何基于级联添加的)。

TRUNCATE并不是MVCC-safe的(参阅Chapter 13获取关于MVCC的基本信息)。 阶段以后,标记将会对所有的并发事务出现空,即使他们在截断发生前使用快照。这将 是一个针对事物发生之前访问截断表的事务的问题—任何这么做的事务至少持有一个 ACCESS SHARE锁,这将锁TRUNCATE直到事务完成。所以 所以截断不会导致在相同表连续查询的表内容上的明显不一致,但会导致截断表和数据库中其他表 在内容上可见的不一致性。

TRUNCATE对表中的数据是事务安全的:如果周围事物不提交,盖世五会安全回滚。

任何作为使用RESTART IDENTITY选项的结果的ALTER SEQUENCE RESTART 操作都是非事务性的并将回滚失败。为了最小化该风险,这些操作仅在所有剩下的 TRUNCATE工作做完以后才执行。然而,若TRUNCATE在一个之后终止的 事务锁内执行,仍然是有风险的。例如,思考:

BEGIN;
TRUNCATE TABLE foo RESTART IDENTITY;
COPY foo FROM ...;
COMMIT;

如果COPY中途失败,表数据回滚正确,但是序列将会剩下小于他们之前拥有的值, 可能会导致关键复制失败或者在后来事务中的其他问题。如果这可能是一个问题,最好避免使用 RESTART IDENTITY,并接受表的新内容将比旧的有更高的系列号。

例子

阶段表bigtablefattable:

TRUNCATE bigtable, fattable;

清空bigtablefattable表:

TRUNCATE bigtable, fattable;

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

TRUNCATE bigtable, fattable RESTART IDENTITY;

截断表othertable,级联到通过外键约束参照othertable 的任何表。

TRUNCATE othertable CASCADE;

清空othertable表,并且级联清空所有通过外键 约束引用othertable的表:

TRUNCATE othertable CASCADE;

兼容性

SQL:2008标准包括一个有语法 TRUNCATE TABLE tablenameTRUNCATE命令。CONTINUE IDENTITY/RESTART IDENTITY 子句也出现在那个标准中,但是有轻微的不同和相关的含义。该命令的一些并发行为通过标准实现了定义, 所以,若必要,上面的注意应该与其他实现考虑和比较。