TRUNCATE
TRUNCATE¶
清空表的所有行。
- 语法
-
``` sql TRUNCATE [TABLE] [ONLY] name [ * ] [, …] [ RESTART IDENTITY | CONTINUE IDENTITY ] [CASCADE | RESTRICT]
```
- 描述
-
TRUNCATE
快速删除一个表或一组表中的所有行。 它与在每个表上进行不限定DELETE
的效果相同,但是由于它实际上并不扫描表,因此速度更快。 这在大型表上最有用。必须在表上具有
TRUNCATE
权限才能清空表行。TRUNCATE
在对其操作的表上获取访问排他锁,这将阻止该表上的所有其他并发操作。 如果指定了RESTART IDENTITY
,则将要重新计数的所有序列都将被排他地锁定。 如果需要并发访问表,则应改用DELETE
命令。 - 参数
-
该SQL命令参数说明见下
name
- 要清空的表的名称(可以用schema修饰)。 如果在表名之前指定了
ONLY
,则仅该表被清空。如果未指定ONLY
,则该表及其所有子表(如果有)将被清空。(可选)可以在表名称后指定*
,以显式指示包括子表。 CASCADE
- 因为此关键字适用于外键引用(SeaboxMPP数据库中不支持),所以它无效。
RESTART IDENTITY
- 自动重新启动被清空表的列所拥有的序列。
CONTINUE IDENTITY
- 不要更改序列的值。这是默认值。
RESTRICT
- 因为此关键字适用于外键引用(SeaboxMPP数据库中不支持),所以它无效。
- 注解
-
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
也出现在该标准中,但是尽管具有相关的含义,但略有不同。该命令的一些并发行为由标准实现定义,因此应考虑上述注意事项,并在必要时与其他实现进行比较。 - 相关SQL命令
DELETE
,DROP TABLE