首页/数据/SQL 速查/DELETE / TRUNCATE / DROP TABLE 对比
变更与事务52 条

DELETE / TRUNCATE / DROP TABLE 对比

三种“删数据”的语义与代价差异明显:选错轻则慢,重则不可回滚丢结构。

SQL 速查数据更新于 2026-10-13

三种删数据方式的区别

DELETE 按条件删除行、事务内可回滚、会触发触发器;TRUNCATE 快速清空整表,速度快但不触发触发器,MySQL 中不能回滚;DROP TABLE 把表结构、数据与索引一起删掉。选错轻则慢,重则不可恢复。

基本信息

DELETE按 WHERE 条件逐行删除并记录日志,事务内可回滚
TRUNCATE清空全部行,按页释放,很快;MySQL 中不可回滚
DROP TABLE删除表结构、数据与索引;MySQL 不可回滚,PG 可回滚
触发器DELETE 会触发;TRUNCATE 与 DROP 都不触发
自增计数DELETE 不重置;MySQL 的 TRUNCATE 会重置
权限要求TRUNCATE 通常需要 DROP 权限,普通业务账号未必有

三种语句

三种语句
DELETE FROM t WHERE id < 1000;   -- 删部分数据,事务内可回滚
DELETE FROM t;                   -- 删全部,逐行记录日志,大表很慢
TRUNCATE TABLE t;                -- 清空整表,很快,MySQL 中不可回滚
DROP TABLE t;                    -- 连表结构一起删掉
-- 执行前确认三件事:备份在不在、条件写得对不对、出问题能否快速恢复

三者对比

维度DELETETRUNCATEDROP TABLE
删除范围满足条件的行全表所有行表结构加数据加索引
事务回滚事务内可回滚MySQL 不可,PG 可MySQL 不可,PG 可
触发器触发 DELETE 触发器不触发不触发
自增计数不重置MySQL 重置,PG 默认不重置随表消失
典型耗时逐行,大表慢按页释放,很快很快

典型使用场景

  • 清理历史数据:按时间条件 DELETE 并分批提交
  • 测试环境重置:TRUNCATE 快速清空表
  • 下线废弃表:确认无引用后 DROP
  • 分表轮转:清空旧分表而不是逐行删除
  • 数据修复:先删临时表再重建
  • 容量回收:删除之后整理空间占用
DELETE 全表不等于 TRUNCATE:前者逐行记录 undo 或 WAL,大表可能要跑几小时并产生巨量日志;后者按页释放,通常几秒完成。只是要清空整表时优先考虑 TRUNCATE。
TRUNCATE 不触发触发器与级联逻辑:依赖触发器做审计或同步的设计在 TRUNCATE 后会静默失效,数据没了但日志里什么都没有,排查成本很高。

易错点

  • 把 TRUNCATE 当“会触发的 DELETE”用:触发器不执行,审计与同步逻辑静默失效
  • 在 MySQL 里指望回滚 TRUNCATE:不支持,删掉就找不回来,执行前必须有备份
  • DELETE 全表不分批:大事务让 undo 或 WAL 暴涨并长时间持锁,应按主键分段提交
  • DROP TABLE 前没确认引用:视图、外键、触发器、应用代码都可能依赖它,先查依赖再删

数据来源与参考

  • MySQL 8.0 Reference Manual · TRUNCATE TABLE
  • PostgreSQL Documentation · TRUNCATE
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌