©
This document uses PHP Chinese website manual Release
TRUNCATE [ TABLE ] [ ONLY ] name [, ... ] [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
TRUNCATE快速地从一堆表中删除所有行。它和在每个 表上进行无条件的DELETE有同样的效果,不过因为它 不做表扫描,因而快得多。在大表上最有用。
要清空的表名字(可以有模式修饰)。如果声明ONLY,只有 那个表会被清空。如果没有声明ONLY,这个表以及其所有子 表(若有)会被清空。
Warning |
自动重启被清空的列的序列。 |
Warning |
不要改变序列的缺省值。此为缺省。 |
级联清空所有在该表上有外键引用的表,或者由于CASCADE 而被添加到组中的表。
如果其他表在该表上有外键引用则拒绝清空。此为缺省。
你必须对表有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,并接受表的新内容将比旧的有更高的系列号。
阶段表bigtable和fattable:
TRUNCATE bigtable, fattable;
清空bigtable和fattable表:
TRUNCATE bigtable, fattable;
同样地,也重置任何相关的序列生成器:
TRUNCATE bigtable, fattable RESTART IDENTITY;
截断表othertable,级联到通过外键约束参照othertable 的任何表。
TRUNCATE othertable CASCADE;
清空othertable表,并且级联清空所有通过外键 约束引用othertable的表:
TRUNCATE othertable CASCADE;
SQL:2008标准包括一个有语法 TRUNCATE TABLE tablename的 TRUNCATE命令。CONTINUE IDENTITY/RESTART IDENTITY 子句也出现在那个标准中,但是有轻微的不同和相关的含义。该命令的一些并发行为通过标准实现了定义, 所以,若必要,上面的注意应该与其他实现考虑和比较。