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