DELETE、TRUNCATE 和 DROP 区别
ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花
核心区别
所属语句 | DML (数据操作语言) | DDL (数据定义语言) | DDL (数据定义语言) |
能否回滚 | 可以 (在事务中) | 不可回滚 | 不可回滚 |
自增主键 | 不重置 | 重置 (归为初始值) | 重置 (归为初始值) |
操作速度 | 慢 (逐行删除,记录日志) | 快 (释放页面,少量日志) | 极快 (直接销毁表结构) |
触发条件 | 需配合 | 不可带 | 直接作用于全表 |
表结构/索引 | 保留 | 保留 | 彻底删除 |
详细深度解析
1. DELETE
- 原理:它是一行一行地从表中删除数据,并且每删除一行,都会在事务日志(Redo Log)中记录一行。
- 优势:灵活且安全。可以通过 WHERE 子句精确删除某一行或部分数据。可以在 BEGIN; ... COMMIT; 事务中操作,误删可以通过 ROLLBACK; 恢复。
- 劣势:慢,数据量越大耗时越长。不会重置自增主键(AUTO_INCREMENT)。如果你删光了所有数据,再插入新数据,ID 会接着最后一个 ID 继续涨,而不是从 1 开始。不会释放表占用的物理空间(高水位标记保留),可能导致表空间膨胀。
2. TRUNCATE
- 原理:它并不直接操作数据,而是直接销毁表中的数据页面(Page),相当于重新创建了一个空表。
- 优势:极速。因为不逐行删除,所以不受数据量大小影响,且日志量极少。
- 劣势:无脑。不能带 WHERE 条件,只能全表清空。不可回滚(在 MySQL 多数存储引擎中)。一旦执行,数据瞬间消失。会触发 AUTO_INCREMENT 主键重置。
- 适用场景:快速清空归档表、日志表,且确定不需要回滚时使用。
3. DROP
- 原理:彻底将表结构和数据一起从数据库中删除。
- 影响:表的索引、触发器、存储过程等一并被删除,资源完全释放。
- 适用场景:不再需要该表时,直接销毁。
代码示例与实践
DELETE(带条件删除)
// 1. 开启事务 BEGIN; // 2. 删除 id 为 1 的用户 DELETE FROM user WHERE id = 1; // 3. 检查无误后提交 COMMIT; // 若出错 -> ROLLBACK; 数据恢复
TRUNCATE(快速清空)
// 直接清空,无日志可回滚 TRUNCATE TABLE user;
DROP(销毁表)
// 连表带数据一起删除 DROP TABLE user;
总结与建议
- 要安全、要精准 ➡️ 用 DELETE(特别是带 Where 条件)。
- 要清空大表、追求极速 ➡️ 用 TRUNCATE。
- 不要了、删表 ➡️ 用 DROP。
ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花
MySQL基础 文章被收录于专栏
《MySQL基础专栏》专为编程新手打造!从SQL核心语法、数据增删改查,到预编译SQL、索引入门、事务基础,层层拆解MySQL必备知识点。专栏摒弃晦涩术语,以通俗讲解+实操案例,带你掌握数据库基础操作,规避SQL注入、性能低效等常见坑,快速搭建MySQL基础体系,轻松应对日常开发中的数据库基础场景。
查看9道真题和解析