MySQL中drop、truncate和delete的区别

✅作者简介:大家好,我是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.mzph.cn/news/787087.shtml

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

相关文章

生成式人工智能对信息安全的挑战及解决方案

概念 生成式人工智能(Artificial Intelligence,AI)基于训练数据以及用户提示词创建新内容的能力,在教育、娱乐、巡检、医疗保健和科学研究等多个领域提供变革潜力,激发起前所未有的关注度和创造力浪潮,引发…

Python数据结构与算法——数据结构(栈、队列)

目录 数据结构介绍 列表 栈 栈的基本操作: 栈的实现(使用一般列表结构即可实现): 栈的应用——括号匹配问题 队列 队列的实现方式——环形队列 队列的实现方式——双向队列 队列内置模块 栈和队列应用——迷宫问题 栈—…

25.死锁

一个线程如果需要同时获取多把锁,就容易产生死锁。 t1线程获得A对象锁,接下来想获取B对象的锁。 t2线程获得B对象锁,接下来想获取A对象的锁。 /*** 死锁demo* param args*/public static void main(String[] args) {Object a new Object(…

RabbitMQ的部分模式

1发布订阅模式 发送者 package org.example; import com.alibaba.fastjson.JSON; import com.rabbitmq.client.BuiltinExchangeType; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import ja…

如何使用【知乎引流软件工具】进行有效引流

知乎,这个内容平台,无疑是品牌和创作者们的乐园。 品牌能在这里找到目标关键词,而创作者们的内容则可以吸引流量,助力各种项目。 别被那些所谓的爆粉秘籍迷惑了,真正的成功往往来自于扎实的内容和策略,而非…

云原生(七)、Kubernetes初学 + 裸机搭建k8s集群

Kubernetes简介 Kubernetes(通常简称为K8s)是一个开源的容器编排平台,最初由Google设计和开发,现在由Cloud Native Computing Foundation(CNCF)维护。它旨在简化容器化应用程序的部署、扩展和管理。 Kube…

IPC 进程间通信

IPC InterProcess Communication The concept of IPC Each process has a differnt user addess space,and local variables 各自看不见,so 进程间通信 need kernel(内核), so a buffer is opened in the kernel,process 1 copies data from user space to this buffer,and …

Linux:运营商在网络中扮演的角色

文章目录 ip目前的问题ip目前的几种解决方案私有ipVS公有ip运营商再谈ip划分运营商的角度看ip 本篇总结的是运营商在网络中扮演的角色 ip目前的问题 在目前看来,ip最大的问题是ip号不够用了,那这个问题如何解决呢? 在之前的内容中有子网掩…

朗之万方程,机器学习与液体中的粒子运动

目录 一、说明二、朗之万方程的诞生2.1 牛顿力学2.2 流体中的随机运动 三、小质量物体布朗运动方程四、布朗运动的Python代码五、稳定性讨论5.1 波尔兹曼分布5.2 梯度下降算法 六、随机梯度下降(SGD)和小批量梯度下降七、机器学习与物理,作为…

加密软件VMProtect教程:使用脚本-功能

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic(本机)、Virtual Pascal和XCode编译器。 同时,VMProtect有一个内置的反汇编程序,可以与Windows和Mac OS X可执行文件一起…

最大连续1的个数||

又用到滑动窗口&#xff0c;关键在于要维持窗口内0的数量在k内 #include<stdio.h> #include<string.h>int Max(int a,int b){return (a>b)?a:b; }int findMaxConsecutiveOnes(int* nums,int numsSize,int k){int left 0;int right 0;int flag 0;//记录包含…

系统设计理念:满足设计要求

在今天的文章中,我们将层层剥离并深入探讨系统设计要求的本质。 让我们了解系统设计的支柱以及如何创建强大且有弹性的应用程序。 什么是好的设计? 在我们深入讨论技术细节之前,让我们先讨论一下什么是好的设计。 当我们谈论系统架构中的良好设计时,我们关注几个关键原则:…

初始C语言最后一章《编译、链接与预处理详解》

前言 感谢老铁们的陪伴和支持&#xff0c;初始C语言专栏在本章内容也是要结束了&#xff0c;这创作一路下来也是很不容易&#xff0c;如果大家对 Java 后端开发感兴趣&#xff0c;欢迎各位老铁来我的Java专栏&#xff01;当然了&#xff0c;我也会更新几章C语言实现简单的数据结…

C++中的面向对象到底是什么

C中的面向对象到底是什么 对象嘛&#xff0c;就和大家都有的对象一样&#xff0c;两只眼睛、一个嘴巴、两条腿…… 对不起跑题了&#xff0c;C的面向对象中的对象可不是显示中的对象哦&#xff0c;但是有一些相似之处&#xff0c;有对象的同学可以参考着去学习C面向对象的概念…

HackTheBox-Machines--Builder

文章目录 1 端口扫描2 测试思路3 漏洞测试 Builder测试过程 1 端口扫描 nmap -sC -sV 10.129.230.2202 测试思路 系统开启了22和8080端口&#xff0c;22端口无账号密码&#xff0c;测试方向主要从8080的jenkins服务开始测试。 在测试开源系统时&#xff0c;可以下载源代码或本地…

基于springboot的一站式家装服务管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的一站式家装服务管理系统…

766. 托普利茨矩阵

给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果矩阵上每一条由左上到右下的对角线上的元素都相同&#xff0c;那么这个矩阵是 托普利茨矩阵 。 示例 1&#xff1a; 输入&#xff1a;matr…

3、jvm基础知识(三)

如何判断堆上的对象没有被引用&#xff1f; 常见的有两种判断方法&#xff1a;引用计数法和可达性分析法。 引用计数法会为每个对象维护一个引用计数器&#xff0c;当对象被引用时加1&#xff0c;取消引用时减1。 引用计数法的优点是实现简单&#xff0c;缺点有两点&#xff1…

电机选型与直线模组(简化版)

2-1电机分类和普通电机选型 1、电机及其原理的基本认知&#xff1a; 电动机我们平时简称电机&#xff0c;大部分情况下指的都是通电后&#xff0c;输出轴会旋转运动的设备。即将电能转换为机械能&#xff0c;供我们使用以驱动机构运行。电机简单的讲&#xff0c;其实就是一个…

ubuntu 一键安装python3.10和pip3.10

在Ubuntu系统上&#xff0c;您可以通过添加官方Python PPA来安装Python 3.10。以下是通过命令行安装Python 3.10和pip的步骤&#xff1a; 打开终端。 添加deadsnakes PPA&#xff08;Personal Package Archive&#xff09;&#xff1a; sudo add-apt-repository ppa:deadsna…