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 更安全 |
浙公网安备 33010602011771号