TRUNCATE 是一个 DML 命令,用于在没有 DELETE 操作的开销的情况下快速删除表的内容。
TRUNCATE 在 PostgreSQL 7.0 中添加。
TRUNCATE 和锁定
与 DELETE 相比,TRUNCATE 在删除表内容之前需要对表进行 ACCESS EXCLUSIVE 锁。虽然 TRUNCATE 本身是一个非常快速的操作,但在活动数据库上,在获取锁之前可能会出现不可预测的延迟,并且 TRUNCATE 命令会显得“卡住”。
变更历史
- PostgreSQL 14
- PostgreSQL 8.4
- PostgreSQL 8.2
- 添加了
CASCADE/RESTRICT选项(提交 984a6ced)
- 添加了
- PostgreSQL 8.1
- 可以提供多个表名(提交 f07b9689)
- PostgreSQL 7.0
- 已添加(提交 e7cad7b0)
示例
基本的 TRUNCATE 执行示例
postgres=# TRUNCATE TABLE foo; TRUNCATE TABLE
尝试截断具有外键引用的表
postgres=# CREATE TABLE foo (id INT PRIMARY KEY); CREATE TABLE postgres=# CREATE TABLE bar (id INT, foo_id INT NOT NULL REFERENCES foo (id)); CREATE TABLE postgres=# TRUNCATE TABLE foo; ERROR: cannot truncate a table referenced in a foreign key constraint DETAIL: Table "bar" references "foo". HINT: Truncate table "bar" at the same time, or use TRUNCATE ... CASCADE.
请注意,TRUNCATE TABLE foo 等同于 TRUNCATE TABLE foo RESTRICT。要递归地从引用表中截断数据,请使用 CASCADE。
postgres=# TRUNCATE TABLE foo CASCADE; NOTICE: truncate cascades to table "bar" TRUNCATE TABLE
也可以显式列出要截断的表
postgres=# TRUNCATE TABLE foo, bar; TRUNCATE TABLE
参考资料
- PostgreSQL 文档: TRUNCATE
有用链接
- PostgreSQL:DELETE 与 TRUNCATE 对比 - Hans-Jürgen Schönig / CyberTec 的 2023 年 3 月博客文章
