PostgreSQL TRUNCATE TABLE 命令详解
                           
天天向上
发布: 2025-03-12 23:43:07

原创
891 人浏览过

TRUNCATE TABLE 用于快速删除表中的所有数据,但不会删除表结构。相比 DELETETRUNCATE 执行速度更快,适用于清空大表数据的场景。


1. 基本语法

TRUNCATE TABLE table_name;
  • table_name:要清空的表名。

示例

TRUNCATE TABLE employees;

这将删除 employees 表中的所有数据。


2. TRUNCATE TABLE vs. DELETE

特性TRUNCATE TABLEDELETE
速度(直接释放存储空间)慢(逐行删除)
触发器不会触发 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

如果表有 SERIALIDENTITY 自增 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 适用于快速清空表数据的场景,更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *