核心结论,delete 和 truncate 都是 SQL 里面用来清空表数据的语句,但是底层原理、语法、事务、自增列、权限、执行速度都存在明显差别,delete 属于 DML 数据操纵语言,可以带 where 条件按行删除,支持事务回滚,truncate 属于 DDL 数据定义语言,只能一次性清空整张表全部数据,不能加 where 条件,默认会提交事务无法回滚,面试和数据库考试高频考点就是区分二者,很多初学者只知道都是删数据,不清楚 truncate 会重置自增 ID,也不知道 truncate 执行速度远快于 delete,学习的时候要从分类、语法、where 条件、事务回滚、自增列、日志、权限、速度、外键约束这几个维度对比,理解为什么大数据量场景优先选择 truncate,同时掌握适用场景,避免生产环境误操作,这个知识点是 MySQL 数据库必考内容,也是后端开发面试必问。
一 核心对比清单
| 对比维度 | delete | truncate |
|---|---|---|
| SQL 分类 | DML 数据操纵语言 | DDL 数据定义语言 |
| 语法 | delete from 表名 where 条件 | truncate table 表名 |
| where 条件 | 支持,可以删除指定行 | 不支持,只能清空整张表 |
| 事务回滚 | 支持,未提交可以 rollback 撤销 | 默认隐式提交,一般不能回滚 |
| 自增列 AUTO_INCREMENT | 保留原来自增计数,不会重置 | 清空之后自增 ID 重置为初始值 1 |
| 日志记录 | 逐行记录 redo binlog,日志量大 | 只记录页释放,日志很少 |
| 执行速度 | 大数据量很慢,逐行删除 | 速度非常快,直接释放数据页 |
| 权限 | 需要 delete 权限 | 需要 drop 权限 |
| 外键约束 | 可以正常执行 | 如果表存在外键关联,通常会报错 |
| 触发器 | 删除行的时候会触发 delete 触发器 | 不会触发 delete 触发器 |
二 语法示例
delete 写法
delete from student where id = 1 删除指定 id 这一行
delete from student 删除整张表全部数据
truncate 写法
truncate table student 清空整张表,没有 where 子句
三 底层原理讲解
delete 执行的时候,数据库是一行一行标记删除,每删除一行都会写入事务日志,它并没有立刻把磁盘上的数据物理抹除,只是标记该行失效,后续还要依靠 vacuum 或者优化操作回收空间,所以表数据量越大,delete 耗时越长,而且因为属于 DML,事务机制完整,可以撤销。
truncate 是直接释放表对应的全部数据页,相当于直接把表的数据存储空间回收,它不是逐行处理,所以不管表里是几千行还是几百万行,执行时间都很短,因为属于 DDL 语句,执行的时候数据库会自动隐式提交事务,绝大多数数据库执行之后不能 rollback 恢复数据。
四 适用场景选择
1 需要按条件删除部分数据,只能使用 delete,truncate 做不到带条件筛选
2 需要保留事务,可以撤销删除操作,选择 delete
3 需要保留自增 ID 继续递增,使用 delete
4 需要一次性清空整张表,不需要保留任何数据,追求最快速度,选择 truncate
5 表绑定外键,优先考虑 delete,truncate 经常会因为外键约束执行失败
五 高频易错点
第一 误以为 truncate 可以加 where,这个是错误,truncate 语法不支持筛选条件
第二 误以为 truncate 也可以回滚,普通 MySQL 默认环境 truncate 隐式提交,不能回滚,特殊隔离模式除外,考试默认结论是不可回滚
第三 混淆权限,truncate 不是 delete 权限,是 drop 级别权限
第四 忘记触发器,delete 逐行删除会触发行级触发器,truncate 不会触发
第五 外键关联表,直接执行 truncate 会报错,需要先解除外键或者改用 delete
【常见问题】
1 delete 和 truncate 差别里面,哪个可以带 where 条件
答 delete 和 truncate 差别里面,只有 delete 支持 where 条件,可以按条件删除指定行,truncate 不支持 where,只能清空整张表全部数据。
2 delete 和 truncate 差别里面,自增 ID 会不会重置
答 delete 和 truncate 差别里面,delete 不会重置自增 ID,truncate 清空表之后自增 ID 会重置回初始值 1。
3 delete 和 truncate 差别里面,哪个执行速度更快
答 delete 和 truncate 差别里面,truncate 执行速度更快,它直接释放数据页,不需要逐行写日志,大数据量清空表优先使用 truncate。
【免责声明】 本文为 MySQL 数据库知识点学习科普,不同数据库比如 Oracle PostgreSQL 在 truncate 事务行为上存在细微差异,生产环境操作前请核对对应数据库官方文档,删除数据属于高危操作,执行前务必备份。
本文来自作者[寻常小阁]投稿,不代表新极网立场,如若转载,请注明出处:https://ent.xjqnpx.com.cn/bkjy/202611/168008.html
评论列表(4条)
我是新极网的签约作者“寻常小阁”!
希望本篇文章《delete 和 truncate 差别 SQL 删除语句考点详解》能对你有所帮助!
本站[新极网]内容主要涵盖:生活百科,小常识,生活小窍门,百科大全
本文概览:核心结论,delete 和 truncate 都是 SQL 里面用来清空表数据的语句,但是底层原理、语法、事务、自增列、权限、执行速度都存在明显差别,delete 属于 DML 数据操纵语言,可以带 where 条件按行删除,支持事务回滚,truncate 属于 DDL 数据定义语言,只能一次性清空整张表全部数据,不能加 where 条件,默认会提交事务无法回滚,面试和数据库考试高频考点就是区分二者,很多初学者只知道都是删数据,不清楚 truncate 会重置自增 ID,也不知道 truncate 执行速度远快于 delete,学习的时候要从分类、语法、where 条件、事务回滚、自增列、日志、权限、速度、外键约束这几个维度对比,理解为什么大数据量场景优先选择 truncate,同时掌握适用场景,避免生产环境误操作,这个知识点是 MySQL 数据库必考内容,也是后端开发面试必问。