PostgreSQL TRUNCATE TABLE 命令详解

TRUNCATE TABLE
用于快速删除表中的所有数据,但不会删除表结构。相比 DELETE
,TRUNCATE
执行速度更快,适用于清空大表数据的场景。
1. 基本语法
TRUNCATE TABLE table_name;
table_name
:要清空的表名。
示例:
TRUNCATE TABLE employees;
这将删除 employees
表中的所有数据。
2. TRUNCATE TABLE
vs. DELETE
特性 | TRUNCATE TABLE | DELETE |
---|---|---|
速度 | 快(直接释放存储空间) | 慢(逐行删除) |
触发器 | 不会触发 DELETE 触发器 | 会触发 DELETE 触发器 |
事务回滚 | 可以回滚(在事务内) | 可以回滚 |
影响的行数 | 不返回行数 | 返回影响的行数 |
约束检查 | 不检查外键约束(默认) | 检查外键约束 |
自增 ID 复位 | 会复位 SERIAL 类型的 ID 计数 | 不会复位 |
3. 带 CASCADE
清空关联表
如果表有外键约束,默认情况下 TRUNCATE
可能会失败。
可以使用 CASCADE
自动清空所有依赖表:
TRUNCATE TABLE employees CASCADE;
这将清空 employees
以及所有引用它的外键表。
4. 带 RESTRICT
保护外键
默认情况下,TRUNCATE
不能删除有外键依赖的表数据。
如果想显式拒绝清空受外键约束的表,可使用 RESTRICT
(默认行为):
TRUNCATE TABLE employees RESTRICT;
如果 employees
被其他表引用,此命令会失败。
5. CONTINUE IDENTITY
vs. RESTART IDENTITY
如果表有 SERIAL
或 IDENTITY
自增 ID,默认情况下 TRUNCATE
不会重置 ID 计数。
可以选择:
CONTINUE IDENTITY
(默认):保留SERIAL
计数,不重置 ID。RESTART IDENTITY
:重置SERIAL
计数,从 1 开始。
5.1 保持 ID 计数
TRUNCATE TABLE employees CONTINUE IDENTITY;
5.2 重置 ID 计数
TRUNCATE TABLE employees RESTART IDENTITY;
6. 在事务中使用 TRUNCATE
TRUNCATE
支持事务,如果 ROLLBACK
,数据不会丢失。
BEGIN;
TRUNCATE TABLE employees;
ROLLBACK; -- 数据不会被删除
COMMIT; -- 确认删除数据
7. TRUNCATE
多个表
一次清空多个表:
TRUNCATE TABLE employees, departments;
如果 departments
依赖 employees
,需要 CASCADE
:
TRUNCATE TABLE employees, departments CASCADE;
8. 使用 TRUNCATE
时的注意事项
✅ 速度快,适用于大表数据清空
✅ 不会触发 DELETE
触发器,谨慎使用
✅ 可在事务中回滚,避免误操作
✅ 默认不检查外键,如果有外键表,使用 CASCADE
✅ 默认不重置 ID 计数,如需重置使用 RESTART IDENTITY
9. 示例总结
-- 清空表但保留 ID 计数
TRUNCATE TABLE employees;
-- 清空表并重置 ID 计数
TRUNCATE TABLE employees RESTART IDENTITY;
-- 清空表并删除所有依赖表数据
TRUNCATE TABLE employees CASCADE;
-- 在事务中使用 TRUNCATE
BEGIN;
TRUNCATE TABLE employees;
ROLLBACK; -- 撤销操作
TRUNCATE TABLE
适用于快速清空表数据的场景,更多详细内容请关注其他相关文章!