DELETE、TRUNCATE 和 DROP 区别

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

核心区别

所属语句

DML (数据操作语言)

DDL (数据定义语言)

DDL (数据定义语言)

能否回滚

可以 (在事务中)

不可回滚

不可回滚

自增主键

不重置

重置 (归为初始值)

重置 (归为初始值)

操作速度

慢 (逐行删除,记录日志)

快 (释放页面,少量日志)

极快 (直接销毁表结构)

触发条件

需配合 WHERE 筛选

不可带 WHERE

直接作用于全表

表结构/索引

保留

保留

彻底删除

详细深度解析

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;

总结与建议

  1. 要安全、要精准 ➡️ 用 DELETE(特别是带 Where 条件)。
  2. 要清空大表、追求极速 ➡️ 用 TRUNCATE。
  3. 不要了、删表 ➡️ 用 DROP。

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

MySQL基础 文章被收录于专栏

《MySQL基础专栏》专为编程新手打造!从SQL核心语法、数据增删改查,到预编译SQL、索引入门、事务基础,层层拆解MySQL必备知识点。专栏摒弃晦涩术语,以通俗讲解+实操案例,带你掌握数据库基础操作,规避SQL注入、性能低效等常见坑,快速搭建MySQL基础体系,轻松应对日常开发中的数据库基础场景。

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务