delete 与 truncate 命令的区别

news2024/11/13 10:08:04

直接去看原文

原文链接:【SQL】delete 与 truncate 命令的区别_truncate和delete的区别-CSDN博客

-------------------------------------------------------------------------------------------------------------------------------- 

1. 相同点

  • 二者都能删除表中的数据
  • 一般情况下, 主流的关系型数据库都支持这两个命令

2. 区别

2.1 SQL 性质的不同
  • delete:属于 DML(数据操作语言) 范畴
  • truncate:属于 DDL(数据定义语言) 范畴
2.2 操作对象不同

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

创建测试视图

create or replace view v_emp
as
select * from emp
where sal > 2000;

delete 测试:删除成功

SQL> delete from v_emp;
6 rows deleted

SQL> commit;
Commit complete

truncate 测试:

SQL> truncate table v_emp;
truncate table v_emp

ORA-01702: 视图不适用于此处
2.3 条件限制区别

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

delete 测试:

SQL> delete from emp where sal > 2000;
6 rows deleted

SQL> commit;
Commit complete

truncate 测试:

SQL> truncate table emp where sal > 2000;
truncate table emp where sal > 2000

ORA-03291: 无效的截断选项 - 缺失 STORAGE 关键字
2.4 事务

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

delete 测试:

SQL> delete from emp;
14 rows deleted

SQL> select count(1) from emp;
  COUNT(1)
----------
         0

此时,在本图形化工具中,显示 14 条信息已被删除,同时查看员工表,得到 0 条数据
之后,若不执行 commit 命令,通过另一个进程再连接上数据库
在这里插入图片描述
此时检索员工表,依旧是 14 条数据,验证了事务不提交后的数据的不完整性(oracle数据库是手动 commit)
再在原窗口执行 commit 命令
在这里插入图片描述
事务得到提交,保证了数据的完整性

truncate 测试:

SQL> truncate table emp;
Table truncated

SQL> select count(1) from emp;
  COUNT(1)
----------
         0

在这里插入图片描述
若使用 rollback 命令回退:

SQL> rollback;
Rollback complete

SQL> select count(1) from emp;
  COUNT(1)
----------
         0

发现:虽然提示 Rollback complete ,但再次检索数据依旧是 0 。发现 truncate 命令不涉及到事务处理

2.5 删除效率

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

测试:

最后生成 1400 万条数据 
SQL> 

14680064 rows inserted


Commit complete

使用 delete命令,已不能在短时间内删除,甚至达不到删除的目的
使用 truncate 命令,可快速删除大批量数据

SQL> truncate table jiker;

Table truncated
2.6 激活触发器

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

2.7 外键约束

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

delete 测试:

直接删除 dept 部门表中的数据

SQL> delete from dept;
delete from dept

ORA-02292: 违反完整约束条件 (SCOTT.FK_DEPTNO) - 已找到子记录

先删除员工表,再删除部门表,成功!

SQL> delete from emp;
14 rows deleted

SQL> commit;
Commit complete

SQL> delete from dept;
4 rows deleted

truncate 测试:

直接删除部门表

SQL> truncate table dept;
truncate table dept

ORA-02266: 表中的唯一/主键被启用的外键引用

先删除员工表,再删除部门表,

SQL> truncate table emp;

Table truncated

SQL> truncate table dept;
truncate table dept

ORA-02266: 表中的唯一/主键被启用的外键引用

依旧不能被删除

3. 应用场景

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

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

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

相关文章

不敢信,30+岁的项目经理会是这样

大家好,我是老原。 你们知道,每个阶段的项目经理都是什么样的吗? 20多岁时,刚踏入项目管理的你可能是个什么都不懂的职场小白,或者只能在旁边打打下手; 到了30岁,经历了项目的人情冷暖&#…

QT中的鼠标事件

鼠标追踪打开后进去一动就显示

我把微信群聊机器人项目开源

▍PART 序 开源项目地址》InsCode - 让你的灵感立刻落地 目前支持的回复 ["抽签", "天气", "讲笑话", "讲情话", "梦到", "解第", "动漫图", "去水印-", "历史今天", "星座-…

Linux控制---进程程序替换

前言:前面我们学洗了Linux进程退出的相关知识,了解了什么是进程退出,已经进程等待的相关话题,今天,我们来学习Linux中的进程程序替换,进程程序替换在Linux中可以用于实现新程序的启动、程序升级、多进程程序…

k8s-集群升级 2

在每个集群节点都安装部署cir-docker 配置cri-docker 升级master节点 导入镜像到本地并将其上传到仓库 修改节点套接字 升级kubelet 注:先腾空后进行升级,顺序不能搞反,否则会导致严重问题 配置kubelet使用cri-docker 解除节点保护 升级wor…

传统企业如何利用软文营销突破重围

数字经济的发展让企业有了更多发展的可能,通过线下线上齐发展能够助力企业推广品牌,获得不错的销量。传统的线下门店销售在数字化时代下还是有一定的局限性,转型只是时间问题,然而有些企业在面对网络营销的时候却束手无策&#xf…

11.15 知识总结(模板层、模型层)

一、 模板层 1.1 过滤器 1.什么是过滤器? 过滤器类似于python的内置函数,用来把变量值加以修饰后再显示。 2. 语法 1、 {{ 变量名|过滤器名 }} 2、链式调用:上一个过滤器的结果继续被下一个过滤器处理 {{ 变量名|过滤器1|过滤器2 }} 3、有的过…

windows 安装 Oracle Database 19c

目录 什么是 Oracle 数据库 下载 Oracle 数据库 解压文件 运行安装程序 测试连接 什么是 Oracle 数据库 Oracle数据库是由美国Oracle Corporation(甲骨文公司)开发和提供的一种关系型数据库管理系统,它是一种强大的关系型数据库管理系统…

kubernetes资源管理

资源管理 资源管理介绍 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes集…

基于Java Web的云端学习系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

Prometheus入门与实战

1.Prometheus介绍 1.什么是监控? 从技术角度来看,监控是度量和管理技术系统的工具和过程,但监控也提供从系统和应用程序生成的指标到业务价值的转换。这些指标转换为用户体验的度量,为业务提供反馈,同样还向技术提供反…

记feign调用第三方接口时header是multipart/form-data

1.请求第三方接口,用feign请求 请求第三方接口,用feign请求,header不通,feign的写法不同 调用时报错Could not write request: no suitable HttpMessageConverter found for request type [com.ccreate.cnpc.mall.dto.zm.ZMPage…

现场直击!触想智能亮相德国2023 SPS展会

当地时间11月14日上午9时 2023 年(德国)纽伦堡国际工业自动化及元器件展览会 SPS 展(以下简称:SPS展会)正式拉开帷幕,触想智能与来自全球各地的领先科技公司及前沿业者齐聚盛会,共赴一场科技与创新交汇的“饕餮盛宴”。 △ 2023 SPS展会开幕(…

sCrypt Playground 发布

sCrypt Playground 发布了。 与桌面IDE 完全相同的功能,但是无需安装。体验地址: https://playground.scrypt.io。 请不要在 sCrypt Playground 上存储重要数据。我们会不定时清除用户保存在其上的数据。

海外邮件接收延迟、接收不到怎么办?U-Mail邮件网关来了

随着经济全球化的发展,很多国内企业开始踏足海外市场,电子邮件就成为了国内企业与海外客户沟通交流的主要渠道。然而海外邮件接收延迟、接收不到等问题成为了困扰企业与海外客户沟通的一大阻碍,导致客户邮件回复不及时,询盘邮件接…

Javaweb之Vue的概述

2.1 Vue概述 通过我们学习的htmlcssjs已经能够开发美观的页面了,但是开发的效率还有待提高,那么如何提高呢?我们先来分析下页面的组成。一个完整的html页面包括了视图和数据,数据是通过请求 从后台获取的,那么意味着我…

移植freertos到qemu上运行

1、freertos源码下载 参考博客:《freertos源码下载和目录结构分析》; 2、编译freertos 2.1、选择合适的Demo freertos官方已经适配过qemu,所以我们并不需要做源码级别的移植,只需要选择合适的Demo文件夹。 2.2、修改Makefile 2.3…

教你轻轻松松写出10万+的微头条爆文,赶紧收藏!

微头条是投放在今日头条上的稿件,重点在于微字,一般在300-500字之间,讲究的是原创干货,有独到见解。 企业和品牌撰写微头条来给自己带来更多曝光和展现。想要让你的微头条写出爆款内容,这是需要讲究技巧的&#xff0c…

PyTorch:张量与矩阵

PyTorch 是一个基于 Python 的科学计算包,专门针对深度学习研究,提供了丰富的工具和库。在 PyTorch 中,张量(tensor)是深度学习的核心数据结构,它可以看作是可以进行自动微分的多维数组。张量不仅可以代表标…