我就是奇迹

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Sql中delete与truncate的区别

在 SQL 中,DELETE 和 TRUNCATE 都是用来删除表中的数据,但它们在行为、性能、是否可回滚、安全性等方面有明显区别

 


 

 

✅ 一、核心区别对比

 

对比项

DELETE

TRUNCATE

删除范围

可删除部分数据(带 WHERE 条件)

全部数据,不支持 WHERE

是否逐行删除

✅ 是

❌ 否(直接释放数据页)

是否触发触发器(Trigger)

✅ 会触发

❌ 不会触发

是否记录事务日志(日志量)

✅ 每行记录日志(慢)

❌ 只记录数据页释放(快)

是否可回滚

✅ 是(事务控制)

✅ 一般数据库支持(但逻辑不同)

重置自增主键(如 AUTO_INCREMENT

❌ 否

✅ 是,从 1 开始

是否删除表结构

❌ 否

❌ 否(表结构保留)

执行速度

慢(逐行)

快(批量释放)

 

 


 

 

🧠 二、简单示例对比

 

 

 

DELETE

 删除部分数据:

 

DELETE FROM user WHERE age > 30;

 

TRUNCATE

 清空整张表:

 

TRUNCATE TABLE user;

 

 


 

 

⚠️ 三、注意事项

 

 

 

 

DELETE

 更安全:

 

 

  • 支持回滚

  • 可精确控制要删哪些行

  • 触发器/外键完整性仍生效

 

 

 

⚠️ 

TRUNCATE

 更激进:

 

 

  • 通常不记录逐行日志,删除更快

  • 有些数据库不能在事务中使用

  • 无法通过 WHERE 筛选部分删除

 

 


 

 

🛠 四、事务支持对比(取决于数据库)

 

数据库

TRUNCATE 可回滚?

MySQL (InnoDB 引擎)

✅ 可回滚(视版本与模式)

Oracle

✅ 可回滚

PostgreSQL

✅ 可回滚

SQL Server

❌ 默认不可回滚(非事务性)

 

 


 

 

✅ 总结推荐

 

你要做什么?

推荐用法

删除指定行数据

DELETE + WHERE

清空整张表、但还要保留结构

TRUNCATE(更快)

要触发触发器或精细控制

DELETE

事务中控制删除操作

DELETE 更安全

 

 

posted on 2025-05-05 19:48  我就是奇迹  阅读(248)  评论(0)    收藏  举报