PostgreSQL DROP 与 TRUNCATE 教程
清空或删除表有三种手段:DELETE(删行)、TRUNCATE(快速清空)、DROP(删表)。它们的行为、速度和可回滚性差异很大。
本篇内容
- DROP TABLE:删除表结构与数据
- TRUNCATE:快速清空数据、保留结构
- DELETE:逐行删除
- 三者对比表与级联行为
DROP TABLE
-- 删除整张表(结构 + 数据)
DROP TABLE users;
-- 幂等写法
DROP TABLE IF EXISTS users;
-- 级联删除依赖它的外键表/视图
DROP TABLE users CASCADE;
TRUNCATE
-- 快速清空所有行,保留表结构,通常比 DELETE 快得多
TRUNCATE TABLE users;
-- 多张一起清空
TRUNCATE TABLE users, orders;
-- 清空并重置自增序列
TRUNCATE TABLE users RESTART IDENTITY;
三种方式对比
| 操作 | 速度 | 保留结构 | 可 WHERE | 触发器 | 事务可回滚 |
|---|---|---|---|---|---|
| DELETE | 慢(逐行) | 是 | 是 | 触发 | 是 |
| TRUNCATE | 快 | 是 | 否 | 不触发行级触发器 | 是(在事务中) |
| DROP | 快 | 否 | 否 | 否 | 是(在事务中) |
待补充(TODO)
- 补充:TRUNCATE 需要的锁与权限(相比 DELETE 更重,会阻塞读写)
- 补充:DELETE 不回收空间的 Vacuum 机制与表膨胀
- 补充:生产环境删表的安全习惯(先重命名确认、备份、DBA 审批)