三种删数据方式的区别
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; -- 连表结构一起删掉
-- 执行前确认三件事:备份在不在、条件写得对不对、出问题能否快速恢复三者对比
| 维度 | DELETE | TRUNCATE | DROP TABLE |
|---|---|---|---|
| 删除范围 | 满足条件的行 | 全表所有行 | 表结构加数据加索引 |
| 事务回滚 | 事务内可回滚 | MySQL 不可,PG 可 | MySQL 不可,PG 可 |
| 触发器 | 触发 DELETE 触发器 | 不触发 | 不触发 |
| 自增计数 | 不重置 | MySQL 重置,PG 默认不重置 | 随表消失 |
| 典型耗时 | 逐行,大表慢 | 按页释放,很快 | 很快 |
典型使用场景
- 清理历史数据:按时间条件 DELETE 并分批提交
- 测试环境重置:TRUNCATE 快速清空表
- 下线废弃表:确认无引用后 DROP
- 分表轮转:清空旧分表而不是逐行删除
- 数据修复:先删临时表再重建
- 容量回收:删除之后整理空间占用
DELETE 全表不等于 TRUNCATE:前者逐行记录 undo 或 WAL,大表可能要跑几小时并产生巨量日志;后者按页释放,通常几秒完成。只是要清空整表时优先考虑 TRUNCATE。
TRUNCATE 不触发触发器与级联逻辑:依赖触发器做审计或同步的设计在 TRUNCATE 后会静默失效,数据没了但日志里什么都没有,排查成本很高。