SQL COMMAND · 表与视图
TRUNCATE
清空一个表或一组表
empty a table or set of tables
TRUNCATE表与视图引入 7.0现存至 20 devel3 次语法变更
- 动词
TRUNCATE- 对象
—- 分组
- 表与视图
- 引入版本
- 7.0
- 状态
- 现存
- 语法变更次数
- 3
- 手册小节数
- 6
版本轨迹
相对 PostgreSQL 17 无变化。
语法铁道图 PostgreSQL 18
沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。
锁模式 PostgreSQL 18
具体锁模式取决于操作变体、目标对象和执行阶段;同一命令可同时取得表锁与行锁。查看完整冲突矩阵
ACCESS EXCLUSIVE· 表级锁TRUNCATE:在被截断的各表上加锁;包含的表和依赖对象依命令选项而定。
语法概要
TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ] [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
描述
TRUNCATE 可以快速移除一组表中的所有行。它的效果与对每个表执行不带条件的 DELETE 相同,但由于它并不实际扫描这些表,因此速度更快。此外,它会立即回收磁盘空间,而不是要求后续再执行一次 VACUUM 操作。这一点对于大表尤其有用。
参数
name要截断的表名(可以是模式限定的)。如果在表名前指定了
ONLY,则只截断该表。如果未指定ONLY,则该表及其所有后代表(如果有)都会被截断。也可以在表名后指定*,以显式表明包含后代表。RESTART IDENTITY自动重新启动由被截断表的列拥有的 sequence。
CONTINUE IDENTITY不更改 sequence 的值。这是默认值。
CASCADE自动截断所有通过外键引用指定表的表,以及通过外键引用因
CASCADE而加入截断范围的表的其他表。RESTRICT如果任一表具有来自命令中未列出表的外键引用,则拒绝截断。这是默认值。
注解
要截断一个表,你必须拥有该表上的 TRUNCATE 权限。
TRUNCATE 会在其操作的每个表上获取
ACCESS EXCLUSIVE 锁,这会阻塞该表上的所有其他并发操作。当指定 RESTART IDENTITY 时,任何需要重新启动的 sequence
也会同样被排他锁定。如果需要对某个表进行并发访问,则应改用
DELETE 命令。
TRUNCATE 不能用于被其他表通过外键引用的表,除非所有这类表也在同一条命令中被截断。因为在这种情况下检查有效性将需要扫描表,而该命令的意义恰恰在于避免这样做。CASCADE
选项可用于自动包含所有依赖表 — 但使用该选项时一定要非常小心,否则你可能会丢失并非有意删除的数据!特别要注意的是,当要截断的表是一个分区时,其同级分区不会受到影响,但级联会无差别地扩展到所有引用它的表以及这些表的全部分区。
TRUNCATE 不会引发这些表上可能存在的任何
ON DELETE 触发器,但会引发
ON TRUNCATE 触发器。如果这些表中的任何一个定义了 ON TRUNCATE 触发器,那么所有
BEFORE TRUNCATE 触发器都会在任何截断发生之前引发,而所有 AFTER TRUNCATE 触发器都会在最后一次截断完成且所有 sequence 被重置之后引发。触发器会按照表的处理顺序引发(先是命令中列出的表,然后是由于级联而加入的表)。
TRUNCATE 不是多版本并发控制(MVCC)安全的。截断之后,如果并发事务使用的是在截断发生前取得的快照,该表对这些并发事务而言将表现为空。详见第 13.6 节。
就表中数据而言,TRUNCATE 是事务安全的:如果外围事务没有提交,截断将被安全地回滚。
当指定 RESTART IDENTITY 时,隐含的
ALTER SEQUENCE RESTART 操作也会以事务方式执行;也就是说,如果外围事务没有提交,它们也会被回滚。请注意,如果在事务回滚前又对这些重启后的 sequence 执行了额外操作,这些操作对 sequence
本身的影响会被回滚,但对 currval() 的影响不会被回滚。也就是说,事务结束后,currval() 仍将反映失败事务内取得的最后一个 sequence 值,即使 sequence 本身可能已经不再与之保持一致。这与失败事务之后 currval() 的通常行为类似。
如果外部数据包装器支持,TRUNCATE 也可以用于外部表,例如参见 postgres_fdw。
示例
截断表 bigtable 和
fattable:
TRUNCATE bigtable, fattable;
同样的操作,并重置所有相关联的 sequence 生成器:
TRUNCATE bigtable, fattable RESTART IDENTITY;
截断表 othertable,并级联到任何通过外键约束引用 othertable 的表:
TRUNCATE othertable CASCADE;
兼容性
SQL:2008 标准包括了一个 TRUNCATE 命令,语法是 TRUNCATE TABLE
。子句
tablenameCONTINUE IDENTITY/RESTART IDENTITY
在该标准中也有出现,但其含义虽相关却略有不同。该命令的某些并发行为在标准中被留作实现定义,因此必要时应结合上述注解并与其他实现进行比较。
另见
语法演化
相邻大版本之间的差异,新的在前。版本号链接到对应快照。
PostgreSQL 15← 14正文更新
正文更新PostgreSQL 14← 13正文更新
正文更新PostgreSQL 12← 11正文更新
正文更新PostgreSQL 10← 9.6正文更新
正文更新PostgreSQL 9.5← 9.4正文更新
正文更新PostgreSQL 9.1← 9.0正文更新
正文更新PostgreSQL 9.0← 8.4正文更新
正文更新PostgreSQL 8.4← 8.3语法变化
+ TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ]+ [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]正文更新PostgreSQL 8.3← 8.2正文更新
正文更新PostgreSQL 8.2← 8.1语法变化
+ TRUNCATE [ TABLE ] name [, ...] [ CASCADE | RESTRICT ]正文更新PostgreSQL 8.1← 8.0语法变化
+ TRUNCATE [ TABLE ] name [, ...]正文更新PostgreSQL 7.4← 7.3正文更新
正文更新PostgreSQL 7.2← 7.1正文更新
正文更新PostgreSQL 7.1← 7.0文件改名
sql-truncate.htm → sql-truncate.html
PostgreSQL 7.0← 6.5新增此命令
同组命令
| 命令 | 动词 | 对象 | 版本变动 | 最近变更 |
|---|---|---|---|---|
TRUNCATE | TRUNCATE | — | 8.43 次 | |
| 清空一个表或一组表 | 现存 | |||
CREATE MATERIALIZED VIEW | CREATE | MATERIALIZED VIEW | 122 次 | |
| 定义一个新物化视图 | 现存 | |||
ALTER MATERIALIZED VIEW | ALTER | MATERIALIZED VIEW | 168 次 | |
| 更改一个物化视图的定义 | 现存 | |||
DROP MATERIALIZED VIEW | DROP | MATERIALIZED VIEW | — | |
| 移除一个物化视图 | 现存 | |||
REFRESH MATERIALIZED VIEW | REFRESH | MATERIALIZED VIEW | 9.41 次 | |
| 替换物化视图的内容 | 现存 | |||
CREATE SEQUENCE | CREATE | SEQUENCE | 188 次 | |
| 定义一个新的序列发生器 | 现存 | |||
ALTER SEQUENCE | ALTER | SEQUENCE | 1810 次 | |
| 更改序列发生器的定义 | 现存 | |||
DROP SEQUENCE | DROP | SEQUENCE | 8.23 次 | |
| 移除一个序列 | 现存 | |||
CREATE TABLE | CREATE | TABLE | 1920 次 | |
| 定义一个新表 | 现存 | |||
ALTER TABLE | ALTER | TABLE | 1826 次 | |
| 更改一个表的定义 | 现存 | |||
DROP TABLE | DROP | TABLE | 8.23 次 | |
| 移除一个表 | 现存 | |||
CREATE TABLE AS | CREATE | TABLE AS | 1911 次 | |
| 根据查询结果定义一个新表 | 现存 | |||
CREATE VIEW | CREATE | VIEW | 9.47 次 | |
| 定义一个新视图 | 现存 | |||
ALTER VIEW | ALTER | VIEW | 145 次 | |
| 更改视图的定义 | 现存 | |||
DROP VIEW | DROP | VIEW | 8.24 次 | |
| 移除一个视图 | 现存 | |||