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 - 2023 年 3 月 Hans-Jürgen Schönig / CyberTec 的博客文章