TRUNCATE
更新时间:2026-06-25
TRUNCATE
清空表的所有行。
语法
SQL
1 TRUNCATE [TABLE] [ONLY] name [ * ] [, ...]
2 [ RESTART IDENTITY | CONTINUE IDENTITY ] [CASCADE | RESTRICT]
3
4 ```
5
6
7
8## 描述
9
10`TRUNCATE`快速删除一个表或一组表中的所有行。 它与在每个表上进行不限定`DELETE`的效果相同,但是由于它实际上并不扫描表,因此速度更快。 这在大型表上最有用。
11
12 必须在表上具有`TRUNCATE`权限才能清空表行。
13
14 `TRUNCATE`在对其操作的表上获取访问排他锁,这将阻止该表上的所有其他并发操作。 如果指定了`RESTART IDENTITY`,则将要重新计数的所有序列都将被排他地锁定。 如果需要并发访问表,则应改用`DELETE`命令。
15
16
17
18## 参数
19
20该SQL命令参数说明见下
21
22 `name`
23 : 要清空的表的名称(可以用schema修饰)。 如果在表名之前指定了`ONLY`,则仅该表被清空。如果未指定`ONLY`,则该表及其所有子表(如果有)将被清空。(可选)可以在表名称后指定`*`,以显式指示包括子表。
24
25 `CASCADE`
26 : 因为此关键字适用于外键引用(PalopgMPP数据库中不支持),所以它无效。
27
28 `RESTART IDENTITY`
29 : 自动重新启动被清空表的列所拥有的序列。
30
31 `CONTINUE IDENTITY`
32 : 不要更改序列的值。这是默认值。
33
34 `RESTRICT`
35 : 因为此关键字适用于外键引用(PalopgMPP数据库中不支持),所以它无效。
36
37
38
39注解
40: `TRUNCATE`将不会运行表可能存在的任何用户定义的`ON DELETE`触发器。
41
42 `TRUNCATE`不会清空从指定表继承的任何表。 仅指定的表被清空,而不是其子表。
43
44 `TRUNCATE`不会清空分区表的任何子表。 如果指定分区表的子表,则`TRUNCATE`不会从该表及其子表中删除行。
45
46 `TRUNCATE`不是MVCC安全的。 清空后,如果并发事务使用清空发生之前获取的快照,则该表将对并发事务显示为空。
47
48 对于表中的数据,`TRUNCATE`是事务安全的:如果所属的事务未提交,则清空将被安全地回滚。
49
50 `TRUNCATE`在其操作的每个表上获取`ACCESS EXCLUSIVE`锁,该锁将阻止该表上的所有其他并发操作。如果需要并发访问表,则应改用`DELETE`命令。
51
52 当指定了`RESTART IDENTITY`时,隐式的`ALTER SEQUENCE RESTART`操作也将以事务方式完成;也就是说,如果所在的事务没有提交,它们将被回滚。 这不同于`ALTER SEQUENCE RESTART`的正常行为。请注意,如果在事务回滚之前对重新启动的序列执行了任何其他序列操作,则这些操作对序列的影响将被回滚,但不会对`currval()`产生影响。也就是说,在事务`currval()`之后,它将继续反映在失败的事务中获得的最后一个序列值,即使序列本身可能不再与此一致。这类似于事务失败后`currval()`的通常行为。
53
54
55
56## 示例
57
58清空表`films`和`distributors`:
59
60 ``` sql
61 TRUNCATE films, distributors;
62 ```
63
64 相同,并重置所有关联的序列生成器:
65
66 ``` sql
67 TRUNCATE films, distributors RESTART IDENTITY;
68 ```
69
70
71
72兼容性说明
73: SQL:2008标准包括带有语法`TRUNCATE TABLE tablename`的`TRUNCATE`命令。 子句`CONTINUE IDENTITY`/`RESTART IDENTITY`也出现在该标准中,但是尽管具有相关的含义,但略有不同。该命令的一些并发行为由标准实现定义,因此应考虑上述注意事项,并在必要时与其他实现进行比较。
74
75
76
77相关SQL命令
78: ` DELETE ` , ` DROP TABLE `
评价此篇文章
