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

37445102526597cac24657d2c2928030.png

作者 | 磊哥

来源 | Java面试真题解析(ID:aimianshi666)

转载请联系授权(微信ID:GG_Stone)

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

truncate、delete、drop区别概述

它们 3 个的区别如下表所示:

区别点droptruncatedelete
执行速度较快
命令分类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);

创建的表结构和数据如下图所示:935f7de4d0fb512572dda7919864e9d8.png

1.删除对象不同

delete 和 truncate 只删除表数据,不删除表结构,其中 delete 删除之后的结果如下:5173583009b808f58261c53287b78040.png我们先将表还原到初始状态,再使用 truncate 执行删除操作,执行结果如下图所示:cc3052306c7b7d8d9d63e67c169671ec.png把表还原到初始状态,执行 drop 删除语句,执行结果如下图所示:8d7d90ada2a54067c5583321704ca5a3.png从上述结果可以看出,delete 和 truncate 只删除表数据,而 drop 把表结构和表数据都删除了

2.删除条件支持不同

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

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”也就是开启了自动提交,如下图所示:1fbcf67f8930d52c4d71cc4774843697.png我们使用以下命令将自动提交(事务)关掉:

set autocommit=off;

再次查询事务自动提交的设置结果如下:e6ac3cc99ac06f4017d4943b8507a1d1.png接下来我们演示一下 delete 的回滚操作,如下图所示:5372ab71f65d2951e29374227ab4b3a6.png从上述结果可以看出 delete 之后是可以进行恢复(回滚)的,而 truncate 和 drop 之后是不能回滚的,各位老铁可以使用相同的方法自行测试一下后两种 SQL 的执行。

5.自增初始化不同

delete 不会重置自增字段的初始值,如下图所示:ec04713f7849e865a15703f565e6cfe4.png而 truncate 会重置自增字段的初始值,如下图所示:5919f2beac752535b81c066c52230fad.png

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

df90de5735fa868d330a10dcdfeb59bb.gif

往期推荐

c885610e87c19002a1360a616cf0e2c5.png

Java面试题周汇总(共57篇)|最新版


539817738a29eff9b4835b434ae02d26.png

面试突击57:聚簇索引=主键索引吗?


2e24b45f5d2b15031ec77796315459f8.png

面试突击56:聚簇索引和非聚簇索引有什么区别?


e73074ccbfa41461760e505e4dc8471b.png

面试突击55:delete、drop、truncate有什么区别?


6a79e931de7048302683a2ea826248a2.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智力游戏

【Description】whitecloth 最近迷上了一个你小时候已经玩厌了的游戏:移火柴棒。他现在吵着要你陪他玩,你没有办法,只好写一个程序来完成这个工作了。你被给出了一个火柴拼成的等式,比如说下面这个:( 5 7 …

面渣逆袭:MySQL六十六问!建议收藏

基础MySQ Logo作为SQL Boy,基础部分不会有人不会吧?面试也不怎么问,基础掌握不错的小伙伴可以跳过这一部分。当然,可能会现场写一些SQL语句,SQ语句可以通过牛客、LeetCode、LintCode之类的网站来练习。1. 什么是内连接…

try-with-resources 中的一个坑,注意避让

小伙伴们好呀,昨天复盘以前做的项目(大概有一年了),看到这个 try-catch ,又想起自己之前掉坑的这个经历 ,弄了个小 demo 给大家感受下~ 😄问题1一个简单的下载文件的例子。这里会出现什么情况…

第 二 十 八 天 :LB 负 载 均 衡 搭 建 之 LVS

小Q:抱怨,是一种负能量,犹如搬起石头砸自己的脚,与人无益,于己不利,于事无补 前面我们介绍了HA高可用集群,今天我们来了解下LB负载均衡集群,在学习完基本的搭建后,在扩展…

一个依赖搞定Spring Boot 配置文件脱敏

经常会遇到这样一种情况:项目的配置文件中总有一些敏感信息,比如数据源的url、用户名、密码....这些信息一旦被暴露那么整个数据库都将会被泄漏,那么如何将这些配置隐藏呢?今天介绍一种方案,让你在无感知的情况下实现配…

js ‘use strict’详解

2019独角兽企业重金招聘Python工程师标准>>> 一、概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode)。顾名思义,这种模式使得Javascript在更严格的条件下运行。 …

如何优雅的写 Controller 层代码?

本篇主要要介绍的就是controller层的处理,一个完整的后端请求由4部分组成:1. 接口地址(也就是URL地址)、2. 请求方式(一般就是get、set,当然还有put、delete)、3. 请求数据(request,有head跟body)、4. 响应数据(response)本篇将解…

面试突击60:什么情况会导致 MySQL 索引失效?

作者 | 磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)为了验证 MySQL 中哪些情况下会导致索引失效,我们可以借助 explain 执行计划来分析索引失效的具体场景。…

使用PHP建立SVN的远程钩子,使用exec命令自动更新SVN的代码

2019独角兽企业重金招聘Python工程师标准>>> 本操作需要使用到php执行sudo命令的权限,相关设置可以参考:apache/Nginx下的PHP/Ruby执行sudo权限的系统命令 通过Svn的钩子功能,可以在我们执行SVN操作时,同时自动执行一些…

Java 中 for 和 foreach 哪个性能高?

作为程序员每天除了写很多 if else 之外,写的最多的也包含 for 循环了,都知道我们 Java 中常用的 for 循环有两种方式,一种是使用 for loop,另一种是使用 foreach,那如果问你,这两种方式哪一种效率最高&…

阿里出品,SpringBoot自动化部署神器!

最近发现一款阿里出品的IDEA插件CloudToolkit,不仅支持直接打包应用部署到远程服务器上,而且还能当终端工具使用。试用了一把这个插件,非常不错,推荐给大家!装上这个插件,IDEA一站式开发又近了一步&#xf…

聊聊异步编程的 7 种实现方式

最近有很多小伙伴给我留言,能不能总结下异步编程,今天就和大家简单聊聊这个话题。早期的系统是同步的,容易理解,我们来看个例子同步编程当用户创建一笔电商交易订单时,要经历的业务逻辑流程还是很长的,每一…

二进制补码乘法除法_二进制乘法和除法

二进制补码乘法除法1)二进制乘法 (1) Binary Multiplication) Binary numbers can be multiplied using two methods, 二进制数可以使用两种方法相乘, Paper method: Paper method is similar to multiplication of decimal numbers on paper. 纸张方法&#xff1a…

控制JSP头部引入外部文件编译后在第一行

2019独角兽企业重金招聘Python工程师标准>>> 一.错误引入方法 假设当前需要在JSP页面输出xml格式数据,需要引入以下外部文件,通过以下的方式来引入则无法正常输出数据: 访问页面会报错误:xml的声明不在文档的第一行 看…

4种常见的缓存模式,你都知道吗?

概述 在系统架构中,缓存可谓提供系统性能的最简单方法之一,稍微有点开发经验的同学必然会与缓存打过交道,最起码也实践过。如果使用得当,缓存可以减少响应时间、减少数据库负载以及节省成本。但如果缓存使用不当,则可能…

面试突击63:distinct 和 group by有什么区别?

作者 | 磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)在 MySQL 中,最常见的去重方法有两个:使用 distinct 或使用 group by,那它们有什…

从20s优化到500ms,我用了这三招

前言接口性能问题,对于从事后端开发的同学来说,是一个绕不开的话题。想要优化一个接口的性能,需要从多个方面着手。本文将接着接口性能优化这个话题,从实战的角度出发,聊聊我是如何优化一个慢查询接口的。上周我优化了…

面试拆解:系统上线后CPU急速飙升,该怎么排查?

上次面试官问了个问题:应用上线后Cpu使用率飙升如何排查?其实这是个很常见的问题,也非常简单,那既然如此我为什么还要写呢?因为上次回答的时候我忘记将线程PID转换成16进制的命令了。所以我决定再重温一遍这个问题&…

MySQL 死锁了,怎么办?

作者:小林coding提纲如下:正文有个业务主要逻辑就是新增订单、修改订单、查询订单等操作。然后因为订单是不能重复的,所以当时在新增订单的时候做了幂等性校验,做法就是在新增订单记录之前,先通过 select ... for upda…

10 张图搞懂服务注册发现机制

在微服务架构或分布式环境下,服务注册与发现技术不可或缺,这也是程序员进阶之路必须要掌握的核心技术之一,本文通过图解的方式带领大家轻轻松松掌握。引入服务注册与发现组件的原因先来看一个问题,假如现在我们要做一个商城项目&a…