TRUNCATE
TRUNCATE
清空表的所有行。
概要
TRUNCATE [TABLE] [ONLY] name [ * ] [, ...] [ RESTART IDENTITY | CONTINUE IDENTITY ] [CASCADE | RESTRICT]
描述
TRUNCATE快速删除一个表或一组表中的所有行。 它与在每个表上进行不限定DELETE的效果相同, 但是由于它实际上并不扫描表,因此速度更快。 这在大型表上最有用。
您必须在表上具有TRUNCATE特权才能清空表行。
TRUNCATE在对其操作的表上获取访问排他锁,这将阻止该表上的所有其他并发操作。 如果指定了RESTART IDENTITY,则将要重新计数的所有序列都将被排他地锁定。 如果需要并发访问表,则应改用DELETE命令。
参数
- name
- 要清空的表的名称(可以用schema修饰)。 如果在表名之前指定了ONLY,则仅该表被清空。 如果未指定ONLY,则该表及其所有子表(如果有)将被清空。 (可选)可以在表名称后指定*,以显式指示包括子表。
- CASCADE
- 因为此关键字适用于外键引用(Greenplum数据库中不支持),所以它无效。
- RESTART IDENTITY
- 自动重新启动被清空表的列所拥有的序列。
- CONTINUE IDENTITY
- 不要更改序列的值。这是默认值。
- RESTRICT
- 因为此关键字适用于外键引用(Greenplum数据库中不支持),所以它无效。
注解
TRUNCATE将不会运行表可能存在的任何用户定义的ON DELETE触发器。
TRUNCATE不会清空从指定表继承的任何表。 仅指定的表被清空,而不是其子表。
TRUNCATE不会清空分区表的任何子表。 如果指定分区表的子表,则TRUNCATE不会从该表及其子表中删除行。
TRUNCATE不是MVCC安全的。 清空后,如果并发事务使用清空发生之前获取的快照,则该表将对并发事务显示为空。
对于表中的数据,TRUNCATE是事务安全的:如果所属的事务未提交,则清空将被安全地回滚。
TRUNCATE在其操作的每个表上获取ACCESS EXCLUSIVE锁,该锁将阻止该表上的所有其他并发操作。 如果需要并发访问表,则应改用DELETE命令。
当指定了RESTART IDENTITY时,隐式的ALTER SEQUENCE RESTART操作也将以事务方式完成; 也就是说,如果所在的事务没有提交,它们将被回滚。 这不同于ALTER SEQUENCE RESTART的正常行为。 请注意,如果在事务回滚之前对重新启动的序列执行了任何其他序列操作,则这些操作对序列的影响将被回滚,但不会对currval()产生影响。 也就是说,在事务currval()之后,它将继续反映在失败的事务中获得的最后一个序列值,即使序列本身可能不再与此一致。 这类似于事务失败后currval()的通常行为。
示例
清空表films和distributors:
TRUNCATE films, distributors;
相同,并重置所有关联的序列生成器:
TRUNCATE films, distributors RESTART IDENTITY;
兼容性
SQL:2008标准包括带有语法TRUNCATE TABLE tablename的TRUNCATE命令。 子句CONTINUE IDENTITY/RESTART IDENTITY也出现在该标准中,但是尽管具有相关的含义,但略有不同。 该命令的一些并发行为由标准实现定义,因此应考虑上述注意事项,并在必要时与其他实现进行比较。