Bohr-L Bohr-L
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

刘博

I'm a slow walker, But I never walk backwards.
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据处理与存储类

  • Spring 生态类

  • 缓存问题类

  • 多线程类

  • JVM 类

  • MySQL 类

    • MySQL 为什么一定要有一个主键
    • MySQL 中的 RR 隔离级别,到底有没有解决幻读问题
    • MySQL 的行级锁到底锁的是什么东西?
    • 存储 MD5 值应该用 VARCHAR 还是用 CHAR?
    • 数据库的三范式是什么?
    • 说说 InnoDB 与 MyISAM 的区别
    • drop、truncate、delete 的区别
      • 聊一聊数据库事务机制
      • 聊一聊 MySQL 中的关联查询
      • 事务隔离级别有哪些?MySQL 的默认隔离级别是什么
      • 分库分表之后,id 主键如何处理?
      • 说说在 MySQL 中一条查询 SQL 是如何执行的?
      • 讲解下 DDL、DML、DCL
      • 存储过程和触发器的作用
      • MySQL 如何行转列和列转行
      • 如何查看 SQL 的执行计划
      • union 和 unionAll 的区别
      • having 和 where 的区别
      • 常见的索引原则
      • MySQL 中的 IN 和 EXISTS 子句有什么区别?
      • MySQL 如何处理 NULL 值,对性能有什么影响?
      • 如何在 MySQL 中处理和避免全表扫描?
      • MySQL 中的表空间是什么,它的作用是什么?
      • 在 MySQL 中,如何优化 ORDER BY 查询?
    • Java 8 + 特性类

    • 其他技术类

    • 常见面试题
    • MySQL 类
    刘博
    2025-12-29
    目录

    drop、truncate、delete 的区别

    drop、truncate、delete 均用于 “删除表或表中数据”,但在操作对象、数据恢复、事务支持、性能等方面差异显著,具体对比如下:

    对比维度 drop truncate delete
    操作对象 删除整个表(包括表结构、数据、索引、约束) 删除表中所有数据,保留表结构(字段、索引、约束) 删除表中指定数据(通过 WHERE 子句)或所有数据(无 WHERE)
    数据恢复 不可恢复(删除后表结构和数据均消失,需通过备份恢复) 不可恢复(删除的数据无法通过事务回滚恢复) 可恢复(若在事务中执行,未提交前可 ROLLBACK 恢复数据)
    事务支持 不支持事务(执行后立即生效,无法回滚) 不支持事务(执行后立即生效,无法回滚) 支持事务(在 InnoDB 中,执行后需 COMMIT 才生效,可 ROLLBACK)
    锁机制 表级锁(锁定整个表,执行期间其他操作无法访问) 表级锁(锁定整个表,执行期间其他操作无法访问) 行级锁(InnoDB 中,删除指定行时加行锁;删除所有行时可能加表锁)
    性能 最快(直接删除表结构,无需处理数据) 较快(直接清空数据文件,不记录日志) 较慢(逐行删除数据,记录 undo 日志和 redo 日志,支持回滚)
    自增字段重置 表被删除,自增字段随表消失;重建表后自增从 1 开始 自增字段重置为 1(InnoDB 中,需表无数据时) 自增字段不重置(删除数据后,下次插入仍从上次自增值开始)
    触发触发器 不触发(删除表,触发器随表消失) 不触发(直接清空数据,不逐行删除) 触发(逐行删除数据,会触发 DELETE 触发器)
    语法格式 DROP TABLE table_name; TRUNCATE TABLE table_name; DELETE FROM table_name [WHERE condition];

    # 关键差异详解

    • 1. 操作对象与表结构:
      • drop 是 “删除表”,执行后表完全消失(需重新 CREATE TABLE 才能使用);
      • truncate 和 delete 是 “删除数据”,表结构保留,可直接插入新数据。
    • 2. 数据恢复与事务:
      • delete 在 InnoDB 中属于事务操作,执行后若未提交(COMMIT),可通过 ROLLBACK 恢复数据;若已提交,需通过备份恢复;
      • truncate 和 drop 执行后立即生效,即使在事务中,也无法通过 ROLLBACK 恢复(因 truncate 不记录 undo 日志,drop 直接删除表结构)。
    • 3. 性能与使用场景:
      • 若需删除整个表:优先用 drop(最快),但需确认后续不再使用该表;
      • 若需清空表数据但保留表结构:优先用 truncate(比 delete 快,因不记录日志),适合大数据量清空(如百万级数据);
      • 若需删除指定数据:必须用 delete(带 WHERE 子句),适合精准删除(如删除 “age>30” 的用户)。
    • 4. 自增字段与触发器:
      • truncate 会重置自增字段(如自增字段当前值为 100,truncate 后下次插入从 1 开始);
      • delete 不会重置自增字段(如删除所有数据后,下次插入仍从 101 开始);
      • delete 会触发 DELETE 触发器(如删除数据时自动记录日志),truncate 和 drop 不会。

    上次更新: 12/30/2025
    说说 InnoDB 与 MyISAM 的区别
    聊一聊数据库事务机制

    ← 说说 InnoDB 与 MyISAM 的区别 聊一聊数据库事务机制→

    最近更新
    01
    CPU 使用率较高排查和解决
    12-29
    02
    JVM OOM 问题如何排查和解决
    12-29
    03
    接口防刷怎么实现?
    12-29
    更多文章>
    Theme by Vdoing | Copyright © 2025-2026 Bohr-L's note
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式