详细了解SQL中delete,drop,truncate的区别和不同

news/2024/7/23 11:45:14 标签: sql, 数据库, mysql

        其实总体来说就一句话就可以概况了,当你不再需要该表时, 用 drop;当你仍要保留该表,但要删除所有记录时, 用 truncate;当你要删除部分记录时, 用 delete。

        看完这就好详细学习过SQL的家人就已经对他们有啥不同和使用场景已经有所概念了吧,但是往往在面试中与会遇到类似的这种问题,所以我们要其更加深入的了解。

命令格式:

sql">delete from 表名 [where 条件]    --删除指定行

drop table 表名;                --删除表

truncate table 表名                --清空表内容,不删除表

TRUNCATE语句和DELETE语句的区别:

1.操作对象不同

sql">delete:能删除表中或基于真实表创建的视图中的数据
truncate:只能删除表中的数据,无法应用在视图上

2.条件限制区别

sql">delete:删除表中数据时,可以通过 where 关键字,进行选择性s删除
truncate:不能使用 where 关键字进行选择性删除

3.事务

sql">delete:删除表中数据时,涉及到事务处理:回退(缓存)、提交、撤退
truncate:删除缓存时,不涉及缓存事务处理

4.删除效率

sql">delete:由于 delete 删除数据时要考虑事务管理(缓存、回退机制、日志记录),所以当删除大批量数据时,速度慢,效率低,甚至达不到删除的目的
truncate:删除大批量数据时,速度快、效率高、但无法撤销

5.激活触发器

sql">delete:在进行删除操作时,可能激活触发器的处理
truncate:不存在激活触发器处理

6.外键约束

sql">delete:可以运用 SQL 语句、按照业务逻辑、按照一定的先后顺序可以删除相关表中的数据
truncate:不能删除对于由 foreign key 约束引用的表,不能删除该表中的数据

Truncate使用注意事项

  1. TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。
  2. DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
  3. TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。
  4. 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。
  5. TRUNCATE TABLE 不能用于参与了索引视图的表。
  6. 对用TRUNCATE TABLE删除数据的表上增加数据时,要使用UPDATE STATISTICS来维护索引信息。
  7. 如果有ROLLBACK语句,DELETE操作将被撤销,但TRUNCATE不会撤销。

总结:TRUNCATE语句和DELETE语句和drop语句的区别:

  1. delete语句,是DML语句,truncate语句通常被认为是DDL语句。
  2. delete语句,后面可以跟where子句,通常指定where子句中的条件表达式,只删除满足条件的部分记录,而truncate语句,只能用于删除表中的所有记录。
  3. truncate语句,删除表中的数据后,向表中添加记录时,自动增加字段的默认初始值重新从1开始,而使用delete语句,删除表中所有记录后,向表中添加记录时,自动增加字段的值,为删除时该字段的最大值加1,也就是在原来的基础上递增。
  4. delete语句,每删除一条记录,都会在日志中记录,而使用truncate语句,不会在日志中记录删除的内容,因此,truncate语句的执行效率比delete语句高。
  5. 效率方面:drop > truncate > delete
  6. drop一般用于删除整体性数据 如表,模式,索引,视图,完整性限制等;delete用于删除局部性数据 如表中的某一元组
  7. DROP把表结构都删了;DELETE只是把数据清掉;truncate是将表进行清空
  8. 当你不再需要该表时, 用 drop;当你仍要保留该表,但要删除所有记录时, 用 truncate;当你要删除部分记录时(always with a WHERE clause), 用 delete.

应用场景:

  • 需要根据一定的业务条件删除数据时、且数据量、性能可控的情况下,可以考虑使用 delete from xxx where 业务条件
  • 需要考虑事务提交、撤销的管理机制时,可以使用 delete
  • 当需要删除大批量数据时,同时要求速度快,效率高并且w无需撤销时,可以使用 truncate
  • 另外,在企业级开发中,实际上都是进行逻辑删除(将数据进行删除标识处理)、而并不进行物理上的删除
  • 在实际生产环境中,一般情况下删除业务处理(过渡表)中的数据
  • 在实际企业开发、维护过程中,不管使用 delete 还是 truncate 命令前,都要考虑数据的备份


http://www.niftyadmin.cn/n/233375.html

相关文章

Linux服务使用宝塔面板搭建网站,并发布公网访问 - 内网穿透

文章目录前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面转载自远程内网穿透的文章:Linux使用宝塔面板搭建网站,并内网穿透实现公网访问 前言 宝塔面板作为简单好用的服务器运维管理面板&#xf…

web后端-请求响应

概述 我们之前在Spring写的 Java类,因为没有继承任何的接口 所以tomcat其实是不识别的,也不能直接运行 但是tomcat识别JavaEE的一项规范-Servlet,因为tomcat就相当于一个Servlet容器 SpringBoot底层提供了一个DisPatcherServlet类(实现了servlet接口)…

【GC垃圾回收算法】让内存垃圾无处藏身

文章目录概述垃圾对象的判定引用计数可达性分析回收垃圾标记清除复制算法标记整理分代回收概述 垃圾回收就是帮我们把不用的内存垃圾自动释放掉 什么是垃圾呢?就是指不再使用的垃圾 如果不进行垃圾回收就会导致一个严重的问题,内存泄漏 内存泄漏&#x…

Python-DQN代码阅读(6)-dpn.py

目录 1.代码 (1)导入所需要的包 (2)设置游戏并选择有效的操作 (3)设置模式(train/test)和开始迭代 (4)创建环境 代码总括: 代码分解: (5&a…

.net6 Program.cs 文件解析

Program.cs 是整个Web应用程序的入口文件,.NET6 用了极简单的风格搞定了很多事情。 Program.cs中首先注意的是: 1.builder.Services.AddXXX是用来添加服务的,builder是WebApplicationBuilder对象; 2.builder.Services.Configure&…

乍得ECTN也被称为乍得BESC

乍得ECTN也被称为乍得BESC BESC是法语BORDEREAU DE SUIVI DE CARGAISON的缩写 ECTN是英文ELECTRONIC CARGO TRACKING NOTE的缩写 翻译成中文为电子货物跟踪单。 根据乍得海关规定凡是发货到乍得恩贾梅纳(NDjamena)港或经由此港转往其他目的地的货运都…

阿里云ECS突发性能型t6和共享型n4性能区别对比

阿里云服务器ECS共享型n4和ECS突发性能型t6性能有区别吗?为什么ECS突发性能型t6便宜,突发性能实例是限制CPU基准性能的,共享型n4实例是100%CPU性能,主要区别在于阿里云突发性能云服务器CPU性能基线的问题,云服务器吧来…

4.18、TCP滑动窗口

4.18、TCP滑动窗口1.滑动窗口的介绍2.滑动窗口通信的例子1.滑动窗口的介绍 滑动窗口(Sliding window)是一种流量控制技术。早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况,同时发送数…