当前位置: 代码网 > it编程>数据库>MsSqlserver > PostgreSQL TRUNCATE TABLE命令的使用

PostgreSQL TRUNCATE TABLE命令的使用

2025年11月06日 MsSqlserver 我要评论
下面是一份 postgresql truncate table 命令 的 完整参考手册,包含 语法、选项、实战示例、性能分析、权限要求、注意事项与最佳实践,适合开发、dba 和架构师使用。一、trun

下面是一份 postgresql truncate table 命令 的 完整参考手册,包含 语法、选项、实战示例、性能分析、权限要求、注意事项与最佳实践,适合开发、dba 和架构师使用。

一、truncate基本概念

truncate table 是 postgresql 中快速删除表中所有数据的命令,比 delete from table 快几十到上百倍。

对比truncatedelete
速度极快(元数据操作)慢(逐行删除 + 触发器)
是否触发触发器默认不触发触发
是否记录 wal少量每行记录
是否可回滚可(在事务中)
是否支持 where不支持支持
是否释放空间可选需 vacuum

二、基本语法

truncate [table] [only] table_name [, ...]
    [restart identity | continue identity]
    [cascade | restrict];

三、选项详解

选项说明示例
only只截断指定表,不包含子表(继承/分区)truncate only users;
*截断表及其所有子表(继承体系)truncate users *;
restart identity重置 sequence(如 serial 列)truncate users restart identity;
continue identity默认,不重置序列truncate users continue identity;
cascade自动截断被外键引用的表truncate orders cascade;
restrict默认,若被引用则拒绝truncate orders restrict;

四、完整示例

1. 基础截断

truncate table logs;

2. 截断多个表(原子操作)

truncate table session_log, error_log, audit_log;

3. 重置自增 id

create table products (
    id serial primary key,
    name text
);

insert into products(name) values ('a'), ('b');

-- 截断并重置 id 从 1 开始
truncate table products restart identity;

-- 下一条 insert 的 id = 1

4. 截断继承表体系

create table events (
    id serial primary key,
    event_type text
);

create table click_events () inherits (events);
create table view_events () inherits (events);

-- 截断父表 + 所有子表
truncate events *;

5. 级联截断(处理外键)

create table users (id serial primary key, name text);
create table orders (
    id serial primary key,
    user_id int references users(id)
);

insert into users(name) values ('alice');
insert into orders(user_id) values (1);

-- 直接截断 users 会失败(restrict 默认)
-- truncate users;  -- error

-- 使用 cascade 自动截断 orders
truncate users cascade;

五、权限要求

操作所需权限
truncate table表所有者 或 truncate 权限
truncate 带 cascade所有相关表的 truncate 权限
-- 授予权限
grant truncate on table logs to app_user;

-- 回收
revoke truncate on table logs from app_user;

六、事务与回滚

begin;

truncate table temp_data;
-- 可以看到数据已清空

rollback;
-- 数据恢复!

commit; -- 真正提交

提示:truncate 在事务中是安全的,适合数据迁移、测试环境清理。

七、性能对比(实测)

表行数deletetruncate加速比
100万~8.2 秒~0.012 秒680x
1000万~85 秒~0.11 秒770x

truncate 是 元数据操作,不扫描行,不写 wal(除非有外键)。

八、触发器行为

create table audit (
    id serial,
    action text,
    ts timestamp default now()
);

create or replace function log_truncate()
returns trigger as $$
begin
    insert into audit(action) values ('truncate ' || tg_table_name);
    return null;
end;
$$ language plpgsql;

-- 尝试创建 truncate 触发器 → 失败!
create trigger trg_log_truncate
    before truncate on users
    execute function log_truncate();

-- error: truncate triggers are not supported

重要:truncate 不触发任何触发器(包括 before/after truncate 不存在)

九、与delete的选择指南

场景推荐命令
清空整个表truncate
保留部分数据delete where ...
需要触发器delete
需要记录审计delete + 触发器
生产环境快速清理truncate ... cascade
测试数据重置truncate restart identity

十、最佳实践脚本

1. 安全截断(生产推荐)

-- 1. 检查外键依赖
select 
    conname, 
    pg_get_constraintdef(oid) 
from pg_constraint 
where confrelid = 'users'::regclass;

-- 2. 使用 cascade + 事务
begin;

truncate table 
    orders, 
    order_items, 
    sessions, 
    cache_table 
restart identity 
cascade;

commit;

2. 重置测试数据库

-- 重置所有表 + 序列
do $$
declare
    r record;
begin
    for r in (
        select tablename 
        from pg_tables 
        where schemaname = 'public' 
          and tablename not like 'pg_%'
    ) loop
        execute 'truncate table ' || quote_ident(r.tablename) || ' restart identity cascade';
    end loop;
end $$;

十一、常见错误与避坑

错误原因解决
cannot truncate table because it is being referenced外键引用用 cascade
permission denied for table无 truncate 权限grant truncate
sequence not restarted用了 continue identity加 restart identity
truncate with partitions分区表语法错误用 truncate parent_table

十二、分区表截断(postgresql 10+)

create table measurement (
    city_id int,
    logdate date,
    temp numeric
) partition by range (logdate);

-- 截断整个分区表
truncate measurement;

-- 仅截断某个分区
truncate measurement_y2025m01;

十三、查看截断历史(通过日志)

-- 启用日志
alter system set log_statement = 'mod';
select pg_reload_conf();

-- 查看 pg_log
tail -f /var/log/postgresql/postgresql.log | grep truncate

十四、速查表

命令效果
truncate t;截断 t
truncate t restart identity;截断 + 重置序列
truncate t cascade;截断 + 级联相关表
truncate t1, t2;原子截断多个表
truncate only t;不包含子表
truncate t *;包含所有子表

十五、总结对比图

delete from table;     → 慢,触发器,wal 多
truncate table table;  → 快,无触发器,wal 少

黄金法则:能用 truncate 就别用 delete 清空表

到此这篇关于postgresql truncate table命令的使用的文章就介绍到这了,更多相关postgresql truncate table内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com