MySQL中drop、truncate和delete的区别

news/2024/6/16 10:45:05/文章来源:https://blog.csdn.net/qq_58608526/article/details/137263253

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉
🍎个人主页:Leo的博客
💞当前专栏:每天一个知识点
✨特色专栏: MySQL学习
🥭本文内容:MySQL中drop、truncate和delete的区别
📚个人知识库: Leo知识库,欢迎大家访问

1.前言

对于drop、truncate和delete,虽然简单,但是真要使用或者面试时候问到还是需要有一定的总结,今天来简单讲讲他们直接的区别。在此之前先简单了解下什么是DDL和DML。
DDL(数据定义语言,Data Definition Language):DDL代表数据定义语言,是一种有助于创建数据库模式的SQL命令。DDL中常用的命令有:createdropaltertruncaterename等等。
DML(数据操作语言,Data Manipulation Language):DML代表数据操作语言,是一种有助于检索和管理关系数据库中数据的SQL命令。DML中常用的命令有:insertupdatedeleteselect等等。

2.drop

DROP命令用于删除整个表(结构和数据),或数据库等对象,特点如下:

  • 彻底删除DROP命令不仅删除表内的所有数据,还删除了表的结构定义。这个过程是不可逆的,除非有备份可以恢复。
  • 释放资源:执行DROP命令后,与该表相关的数据库资源会被释放。
  • 非事务性操作DROP操作通常不能回滚,执行DROP命令后,相关对象就被立即删除。
  • 自增ID:如果创建新表,自增ID会重新开始计数。

代码示例:

DROP TABLE employees;

注意:DROP语句执行后立即生效,无法找回。

3.truncate

TRUNCATE命令用于删除表中的所有行,其特点如下:

  • 快速清空表TRUNCATE比使用DELETE删除表中的所有行要快得多,因为它不逐行删除数据,而是通过释放存储这些数据的数据页来删除数据并重新初始化表。

  • 非事务性操作:尽管某些数据库管理系统可能允许TRUNCATE操作在事务中回滚,但在很多情况下,TRUNCATE并不记录详细的日志,因此不能像DELETE操作那样保证事务安全。

  • 不触发触发器:通常,执行TRUNCATE操作不会触发表的触发器。

  • 自动重置自增ID:对于有自增主键的表,TRUNCATE会重置自增计数器。

  • truncate会删除表中所有记录,并且将重新设置高水线和所有的索引。

    就是truncate会删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子),缺省情况下将空间释放到minextents的extent(就是表结构中的段内的区域),除非使用reuse storage(使用这句话,所在的extent空间不会被回收,只是将数据删除掉,数据删除之后的freespace空间,只能供本表使用,其他的不可以使用)。不会记录日志,所以执行速度很快,但不能通过rollback撤消操作(如果一不小心把一个表truncate掉,也是可以恢复的,只是不能通过rollback来恢复

示例:

TRUNCATE TABLE employees;

注意:TRUNCATE语句执行后立即生效,无法找回。

4.delete

DELETE命令用于删除表中的一行或多行记录,具有如下特点:

  • 选择性删除:可以通过WHERE子句指定删除哪些行。若不指定WHERE子句,则删除表中的所有行。

  • 事务性操作DELETE操作是事务安全的,这意味着你可以在一个事务中回滚DELETE操作。这在你意外删除了错误数据时非常有用。

  • 触发器:如果表上有触发器,执行DELETE操作会触发它们。

  • 性能:因为DELETE操作逐行删除数据,并记录日志,所以在删除大量数据时可能会比较慢。

  • delete语句不影响表所占用的extent(就是表结构的中的区),高水线(high watermark)保持原位置不变。 (高水位线就存在于段(segment)中,它用于标识段中已使用过的数据块与未使用的数据块二者间交界,扫描表数据的时候,高水位线以下的所有数据块都必须被扫描。)

  • 在 InnoDB 中,delete其实并不会真的把数据删除,mysql 实际上只是给删除的数据打了个标记为已删除,因此 delete 删除表中的数据时,表文件在磁盘上所占空间不会变小,存储空间不会被释放,只是把删除的数据行设置为不可见。虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以重用这部分空间(重用 → 覆盖)。

  • delete执行时,会先将所删除数据缓存到rollback segement中,事务commit之后生效;delete from table_name删除表的全部数据,对于MyISAM 会立刻释放磁盘空间,InnoDB 不会释放磁盘空间;
    对于delete from table_name where xxx带条件的删除, 不管是InnoDB还是MyISAM都不会释放磁盘空间;
    delete操作以后使用 optimize table table_name则会立刻释放磁盘空间。不管是InnoDB还是MyISAM 。所以要想达到释放磁盘空间的目的,delete以后执行optimize table操作。

示例:

DELETE FROM employees WHERE department = 'Sales';

5.总结

在速度上,一般来说,drop> truncate > delete

  • 如果想删除部分数据用delete,注意带上where子句,回滚段要足够大;如果想删除表,当然用drop;
  • 如果想保留表而将所有数据删除,如果和事务无关(不能回滚),用truncate即可;
  • 如果和事务有关,或者想触发trigger,还是用delete;
  • 如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
  • truncate与drop是DDL语句,执行后无法回滚;delete是DML语句,可回滚。
  • truncate只能作用于表;delete,drop可作用于表、视图等。
  • truncate会清空表中的所有行,但表结构及其约束、索引等保持不变;drop会删除表的结构及其所依赖的约束、索引等。
  • truncate会重置表的自增值;delete不会。
  • truncate不会激活与表有关的删除触发器;delete可以。
  • truncate后会使表和索引所占用的空间会恢复到初始大小;delete操作不会减少表或索引所占用的空间,drop语句将表所占用的空间全释放掉。

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

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

相关文章

【Vue3源码学习】— CH2.7 Computed: Vue 3 计算属性深入解析

Computed: Vue 3 计算属性深入解析 1.计算属性的基本用法2. ComputedRefImpl 类深入解析JavaScript 中的 getter 函数 3. 计算属性的创建:computed 方法解析3.1 源码解析3.2 使用示例 4. 计算属性的工作原理5. 手动实现简化的计算属性6. 结语 在 Vue 3 的响应式系统…

golang 和java对比的优劣势

Golang(或称Go)和Java都是非常流行的编程语言,被广泛应用于各种领域的软件开发。尽管它们都是高级编程语言,但它们具有许多不同的特性和适用场景。本文将重点比较Golang和Java,探讨它们的优势和劣势。 性能方面&#…

Spark实战:词频统计

文章目录 一、Spark实战:词频统计(一)Scala版1、分步完成词频统计2、一步搞定词频统计 (二)Python版1、分步完成词频统计2、一步搞定词频统计 二、实战总结 一、Spark实战:词频统计 (一&#x…

解锁AI提示工程新纪元:你的提问是关键!

文章目录 一、AI的潜力:无尽的宝藏等待解锁二、提问的艺术:挖掘AI潜力的关键三、AI的回应:超越预期的答案与启示四、提问的力量:推动AI不断进步与发展五、用提问开启与AI的智慧对话《向AI提问的艺术:提示工程入门与应用…

RK3562开发板:安卓Linux开发从入门到精通(二)

导读: 通过上篇介绍RK3562的文章我们学习了关于:认识接口、固件下载、安装驱动和烧录工具、烧录固件等内容。这些知识的回顾,希望能够帮助您更好地理解RK3562的使用方法和开发流程。 接下来这篇教程中:我们将重点介绍串口调试、…

[AutoSar]BSW_Memory_Stack_001 存储栈概述

目录 关键词平台说明背景一、存储栈的组成和功能二、名称定义和描述2.1 片上单次最小擦除范围和单次最小写入范围 三、EEPROM(DFLASH)和Flash3.1EEPROM(DFLASH)3.2 Flash 四、实现总览 关键词 嵌入式、C语言、autosar、OS、BSW …

Flutter仿Boss-3.登录页

效果 介绍 在Flutter应用程序中创建登录页面对于用户认证和参与至关重要。登录页面作为用户访问应用程序功能的入口。它应该提供无缝的体验,同时确保安全和隐私。这里仿Boss应用设计的登录页面,我们将创建一个登录页面,允许用户使用手机号码…

第21章-直连路由和静态路由

1. 直连路由 1)定义:指路由器接口直接相连的网段的路由; 2)特点: ① 不需要特别的配置,双UP(物理层+数据链路层); ② 在路由器的接口上配置IP地址即可; ③ 开机自动产生; 2. VLAN间路由 1)需求: 交换机划vlan隔离广播域,在二层无法通信,但三层要实现不同vlan之前…

吴恩达机器学习笔记:第 6 周-11机器学习系统的设计(Machine Learning System Design)11.1-11.2

目录 第 6 周 11、 机器学习系统的设计(Machine Learning System Design)11.1 首先要做什么11.2 误差分析11.3 类偏斜的误差度量 第 6 周 11、 机器学习系统的设计(Machine Learning System Design) 11.1 首先要做什么 在接下来的视频中,我将谈到机器学习系统的设…

【Algorithms 4】算法(第4版)学习笔记 23 - 5.4 正则表达式

文章目录 前言参考目录学习笔记1:正则表达式1.1:表示1.2:快捷表示2:正则表达式与非确定有限状态自动机 REs and NFAs2.1:二元性2.2:模式匹配实现2.3:非确定有限状态自动机 Nondeterministic fin…

python课后习题二

题目: 1. 2. 解题过程: 1. # 有序吗? ls input("请输入一个列表(空格隔开):").split() ls_list list(ls) ls_listnew sorted(ls_list) if ls_listnew ls_list:print("列表已排序&quo…

Autodesk Maya 2025---智能建模与动画创新,重塑创意工作流程

Autodesk Maya 2025是一款顶尖的三维动画软件,广泛应用于影视广告、角色动画、电影特技等领域。新版本在功能上进行了全面升级,新增了对Apple芯片的支持,建模、绑定和角色动画等方面的功能也更加出色。 在功能特色方面,Maya 2025…

【AI数字人】根据音频生成带动画的数字人

这是一个从音频和蒙面手势生成全身人体手势的框架,包括面部、局部身体、手和整体动作。为了实现这一目标,我们首先引入 BEATX (BEAT-SMPLXFLAME),一个新的网格级整体协同语音数据集。 BEATX 将 MoShed SMPLX 身体与 FLAME 头部参数相结合,进一步细化头部、颈部和手指运动的…

DolphinScheduler on k8s 云原生部署实践

文章目录 前言利用Kubernetes技术云原生平台初始化迁移基于Argo CD添加GitOpsDolphinScheduler 在 k8s 上的服务自愈可观测性集成服务网格云原生工作流调度从HDFS升级到S3文件技术总结 前言 DolphinScheduler 的高效云原生部署模式,比原始部署模式节省了95%以上的人…

谷粒商城实战(008 缓存)

Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第151p-第p157的内容 简介 数据库承担落盘(持久化)工作 拿map做缓存 这种是本地缓存,会有一些问题 分布…

VMware虚拟机共享主机v2rayN

目录 🌼前言 🌼解释 🚩操作 1)VMware -- 虚拟网络编辑器 2)VMware -- 网络适配器 3)主机 IP 地址 4)v2rayN 代理端口 5)VMware -- 网络代理(Network proxy) 🎂结…

【面试八股总结】传输控制协议TCP(三)

参考资料 :小林Coding、阿秀、代码随想录 一、TCP拥塞控制⭐ 1. 慢启动 – Slow Start 慢启动是指TCP连接刚建立,一点一点地提速,试探一下网络的承受能力,以免直接扰乱了网络通道的秩序。 慢启动算法: 初始拥塞窗口…

探索设计模式的魅力:AI大模型如何赋能C/S模式,开创服务新纪元

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 AI大模型如何赋能C/S模式,开创服务新纪元 数字化飞速发展的时代,AI大模型…

提升常州小程序软件开发的搜索排名:关键步骤解析

在移动互联网的浪潮中,小程序作为连接用户与服务的桥梁,其重要性日益凸显。对于常州的小程序软件开发企业来说,如何让自己的产品在浩如烟海的互联网信息中脱颖而出,提升搜索排名,成为了亟待解决的问题。本文将为您解析…

C++面向对象程序设计 - 访问对象中成员的3种方法

在C程序中访问对象的成员变量和成员函数,有三种方法: 通过对象名和成员运算符访问对象中的成员;通过指向对象的指针访问对象中的成员;通过对象的引用变量访问对象中的成员 在了解访问对象中成员的3种方法前,先了解下C…