面试突击58:truncate、delete和drop的6大区别

在 MySQL 中,使用 truncate、delete 和 drop 都可以实现表删除,但它们 3 个的使用场景和执行效果完全不同,接下来我们来盘点一下。

truncate、delete、drop区别概述

它们 3 个的区别如下表所示:
区别点 drop truncate delete

执行速度 快 较快 慢 命令分类 DDL(数据定义语言) DDL(数据定义语言) DML(数据操作语言) 删除对象
删除整张表和表结构

,以及表的索引、约束和触发器。
只删除表数据

,表的结构、索引、约束等会被保留。
只删除表的全部或部分数据

,表结构、索引、约束等会被保留。 删除条件(where) 不能用 不能用 可使用 回滚 不可回滚 不可回滚 可回滚 自增初始值 – 重置 不重置

接下来我们用案例来演示一下它们的区别。

准备工作

正式开始之前,我们先来创建一个用户表和用户测试数据,方便后续演示使用:

CREATE TABLE userinfo (
  id int(11) NOT NULL AUTO_INCREMENT comment '编号',
  name varchar(250) NOT NULL comment '姓名' unique,
  balance decimal(10,2) NOT NULL DEFAULT '0.00' comment '账户余额',
  PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
insert into userinfo values(1,'张三',1000),(2,'李四',500),(3,'王五',2000),(4,'李六',500);

创建的表结构和数据如下图所示:

面试突击58:truncate、delete和drop的6大区别

1.删除对象不同

delete 和 truncate 只删除表数据,不删除表结构,其中 delete 删除之后的结果如下:

面试突击58:truncate、delete和drop的6大区别
我们先将表还原到初始状态,再使用 truncate 执行删除操作,执行结果如下图所示:
面试突击58:truncate、delete和drop的6大区别
把表还原到初始状态,执行 drop 删除语句,执行结果如下图所示:
面试突击58:truncate、delete和drop的6大区别
从上述结果可以看出, delete 和 truncate 只删除表数据,而 drop 把表结构和表数据都删除了

2.删除条件支持不同

truncate 和 drop 不支持添加 where 条件,而 delete 支持 where 条件,如下图所示:

面试突击58:truncate、delete和drop的6大区别

3.命令分类不同

truncate、delete 和 drop 所属 SQL 分类不同,SQL 分为以下 3 类:

  1. DDL【Data Definition Language】数据定义语言,用来维护存储数据的结构代表指令: create、drop、alter、truncate。
  2. DML【Data Manipulation Language】数据操纵语言,用来对数据进行操作代表指令:insert,delete,update,DML 中又单独分了一个 DQL,数据查询语言,代表指令是 select。
  3. DCL【Data Control Language】数据控制语言,主要负责权限管理和事务代表指令:grant,revoke,commit。

其中 delete 属于 DML,而 truncate 和 drop 属于 DDL。

PS:truncate 是先复制一个新的表结构,再把原有旧表结构和数据一起删除,所以它属于数据定义语言 DDL,而非数据操纵语言 DML。

4.回滚支持不同

delete 属于 DML 支持事务回滚操作,而 truncate 和 drop 属于 DDL,执行之后立马生效,且数据是不可恢复的,接下来我们来验证一下。
首先先将 MySQL 的自动事务提交关闭,自动事务提交的默认值是”ON”也就是开启了自动提交,如下图所示:

面试突击58:truncate、delete和drop的6大区别
我们使用以下命令将自动提交(事务)关掉:
set autocommit=off;

再次查询事务自动提交的设置结果如下:

面试突击58:truncate、delete和drop的6大区别
接下来我们演示一下 delete 的回滚操作,如下图所示:
面试突击58:truncate、delete和drop的6大区别
从上述结果可以看出 delete 之后是可以进行恢复(回滚)的,而 truncate 和 drop 之后是不能回滚的,各位老铁可以使用相同的方法自行测试一下后两种 SQL 的执行。

5.自增初始化不同

delete 不会重置自增字段的初始值,如下图所示:

面试突击58:truncate、delete和drop的6大区别
而 truncate 会重置自增字段的初始值,如下图所示:
面试突击58:truncate、delete和drop的6大区别

6.执行速度不同

delete 是逐行执行的,并且在执行时会把操作日志记录下来,以备日后回滚使用,所以 delete 的执行速度是比较慢的;而 truncate 的操作是先复制一个新的表结构,再把原先的表整体删除,所以它的执行速度居中,而 drop 的执行速度最快。

总结

truncate、drop 和 delete 的区别主要有以下 6 点:

  1. 执行速度:drop > truncate > detele。
  2. delete 和 truncate 只删除表数据,而 drop 会删除表数据和表结构以及表的索引、约束和触发器。
  3. delete 可以加 where 条件实现部分数据删除,而 truncate 和 drop 不能加 where 条件是整体删除。
  4. truncate 和 drop 是立即执行,且不能恢复;而 delete 会走事务,可以撤回和恢复。
  5. truncate 会重置自增列为 1,而 delete 不会重置自增列。
  6. truncate 和 drop 是 DDL 语句,而 delete 是 DML 语句。

是非审之于己,毁誉听之于人,得失安之于数。
公众号:Java面试真题解析
面试合集:https://gitee.com/mydb/interview

Original: https://www.cnblogs.com/vipstone/p/16392107.html
Author: Java中文社群
Title: 面试突击58:truncate、delete和drop的6大区别

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/539324/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 哈工大软件构造实验Lab2中assert的使用

    防扒链接: 何以牵尘的博客_CSDN博客-哈工大课内学习,哈工大精品课程笔记领域博主何以牵尘擅长哈工大课内学习,哈工大精品课程笔记,等方面的知识; https://blog.csd…

    Java 2023年6月9日
    083
  • 多系统对接的适配与包装模式应用

    日常开发系统中通常需要对接多个系统,需要用到适配器模式。 例如:支付方式就涉及多个系统对接。 国际惯例,先引入概念。 适配器模式: 提到适配器自然就能想到手机用的电源适配器。 他的…

    Java 2023年6月9日
    080
  • 创建对象时类的调用顺序

    代码块 1.创建一个对象时,在一个类中调用的顺序是: 1.调用静态代码块和静态属性初始化(优先级相同,如果有多个,则按他们定义的顺序调用) 2.调用普通代码块和普通属性的初始化(优…

    Java 2023年6月5日
    072
  • aspose java word 插入特殊字符

    遇到一个需求,要在word文档中插入一些符号,入下图所示: 参考:https://blog.csdn.net/qq_35192741/article/details/9849798…

    Java 2023年5月29日
    073
  • 微服务入门之Hystrix

    一、分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。 服务雪崩 多个微服务之间调用的时候,假设微服务A调用微服务B和微…

    Java 2023年6月9日
    099
  • 【Mybatis错误】Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 584; The content of elements must consist of well-formed character data or markup

    编译器自动把sql语句中的小于号当成了开始标签 and a.start_time 你投入得越多,就能得到越多得价值 Original: https://www.cnblogs.co…

    Java 2023年5月30日
    0132
  • Struts2漏洞发现

    fofa语法 app=”Struts2″ 导出所有的url,保存为target.txt扫描漏洞 ./xray webscan –plu…

    Java 2023年6月6日
    070
  • SQL如将数据放在同一组返回,只拿一个,函数:any_value()

    举例:表里存了员工姓名,部门名称,员工薪资信息 由于在通过部门分组的时候,ename的值出现的碰撞,以第一部门举例,通过group by后,第一部门会以一条数据的形式展示,但是部门…

    Java 2023年6月9日
    073
  • 扒光美女衣服(全新日本妄撮) 源代码研究

    撮掉美女衣服( 妄撮)游戏 源码激动!想必大家一定听说过《 妄撮 》又名《撕开美女衣服》这个手机游戏,体验非常棒,很h很bl啊,现在很难下载到。不过今天哥在一个论坛竟然发现了这个游…

    Java 2023年5月29日
    0144
  • 程序员都遇到过哪些误解?

    程序员: 为计算机编写代码的人,按照现代企业研发部的岗位,分为:开发工程师,运维工程师,架构师,数据工程师,算法工程师等; 误解: 即事实是另外一种情况,而因为环境的复杂性或者消息…

    Java 2023年6月8日
    087
  • 面向对象和函数式

    阅读前,请先封印以下能力:类、闭包、继承&多态、高阶函数…… 现在,你只会全局变量和函数,开始写一个带 cache 的 fibonacci。 con…

    Java 2023年6月16日
    065
  • C#线程调度AutoResetEvent和ManualResetEvent区别

    共同点: 均继承 EventWaitHandle 接口,因此,均具有以下功能: Reset() //红灯 Set() //绿灯 WaitOne() // 等待信号 本质都是阻塞信号…

    Java 2023年5月29日
    058
  • Java 基础常见知识点&面试题总结(上),2022 最新版!| JavaGuide

    你好,我是 Guide。秋招即将到来,我对 JavaGuide 的内容进行了重构完善,公众号同步一下最新更新,希望能够帮助你。 基础概念与常识 Java 语言有哪些特点? 简单易学…

    Java 2023年6月9日
    075
  • 再见了Antirez永远的Redis之神

    其实antirez(Redis作者)退出Redis维护一发布我就在很多咨询网站上面看到了,当时也没太多感慨。 今天比较有空想去看看霉霉Twitter的,然后看到了antirez,我…

    Java 2023年6月9日
    075
  • Sublime Text 编译 运行 Java 源代码 包 类文件

    Sublime Text 编译 Java 包 更新记录 2022/05/23 解决SublimeText控制台用户输入问题 前言 目前还存在很多问题,不过暂时能用,就先不折腾了,等…

    Java 2023年6月5日
    069
  • Java微服务分布式架构

    摘自《Java微服务分布式架构企业实战》 1.传统单体应用架构存在的问题一个完整的单体应用程序通常主要由三部分组成:客户端用户界面、模块和数据库,如图1.1所示。传统单体应用的开发…

    Java 2023年5月29日
    072
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球