↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / SQL 命令 / 表与视图

SQL COMMAND · 表与视图

TRUNCATE

清空一个表或一组表

empty a table or set of tables

TRUNCATE表与视图引入 7.0现存至 20 devel3 次语法变更

动词
TRUNCATE
对象
—
引入版本
7.0
状态
现存
语法变更次数
3
手册小节数
6

本站手册 · 18官方文档 ↗

版本轨迹

相对 PostgreSQL 17 无变化。

语法铁道图 PostgreSQL 18

沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。

TRUNCATE TABLE ONLY name * , RESTART IDENTITY CONTINUE IDENTITY CASCADE RESTRICT

锁模式 PostgreSQL 18

具体锁模式取决于操作变体、目标对象和执行阶段;同一命令可同时取得表锁与行锁。查看完整冲突矩阵

ACCESS EXCLUSIVE · 表级锁

TRUNCATE:在被截断的各表上加锁;包含的表和依赖对象依命令选项而定。

语法概要

TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ]
[ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]

PostgreSQL 18 手册 · 查看完整参考页

描述

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 tablename。子句 CONTINUE IDENTITY/RESTART IDENTITY 在该标准中也有出现,但其含义虽相关却略有不同。该命令的某些并发行为在标准中被留作实现定义,因此必要时应结合上述注解并与其他实现进行比较。

另见

语法演化

相邻大版本之间的差异,新的在前。版本号链接到对应快照。

  1. PostgreSQL 15← 14正文更新

    正文更新
  2. PostgreSQL 14← 13正文更新

    正文更新
  3. PostgreSQL 12← 11正文更新

    正文更新
  4. PostgreSQL 10← 9.6正文更新

    正文更新
  5. PostgreSQL 9.5← 9.4正文更新

    正文更新
  6. PostgreSQL 9.1← 9.0正文更新

    正文更新
  7. PostgreSQL 9.0← 8.4正文更新

    正文更新
  8. PostgreSQL 8.4← 8.3语法变化

    + TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ]+ [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]正文更新
  9. PostgreSQL 8.3← 8.2正文更新

    正文更新
  10. PostgreSQL 8.2← 8.1语法变化

    + TRUNCATE [ TABLE ] name [, ...] [ CASCADE | RESTRICT ]正文更新
  11. PostgreSQL 8.1← 8.0语法变化

    + TRUNCATE [ TABLE ] name [, ...]正文更新
  12. PostgreSQL 7.4← 7.3正文更新

    正文更新
  13. PostgreSQL 7.2← 7.1正文更新

    正文更新
  14. PostgreSQL 7.1← 7.0文件改名

    sql-truncate.htm → sql-truncate.html

  15. PostgreSQL 7.0← 6.5新增此命令

同组命令

命令动词对象版本变动最近变更
TABLES & VIEWS表与视图15 条↑
TRUNCATETRUNCATE— 8.43 次
清空一个表或一组表现存
CREATE MATERIALIZED VIEWCREATEMATERIALIZED VIEW 122 次
定义一个新物化视图现存
ALTER MATERIALIZED VIEWALTERMATERIALIZED VIEW 168 次
更改一个物化视图的定义现存
DROP MATERIALIZED VIEWDROPMATERIALIZED VIEW —
移除一个物化视图现存
REFRESH MATERIALIZED VIEWREFRESHMATERIALIZED VIEW 9.41 次
替换物化视图的内容现存
CREATE SEQUENCECREATESEQUENCE 188 次
定义一个新的序列发生器现存
ALTER SEQUENCEALTERSEQUENCE 1810 次
更改序列发生器的定义现存
DROP SEQUENCEDROPSEQUENCE 8.23 次
移除一个序列现存
CREATE TABLECREATETABLE 1920 次
定义一个新表现存
ALTER TABLEALTERTABLE 1826 次
更改一个表的定义现存
DROP TABLEDROPTABLE 8.23 次
移除一个表现存
CREATE TABLE ASCREATETABLE AS 1911 次
根据查询结果定义一个新表现存
CREATE VIEWCREATEVIEW 9.47 次
定义一个新视图现存
ALTER VIEWALTERVIEW 145 次
更改视图的定义现存
DROP VIEWDROPVIEW 8.24 次
移除一个视图现存