Oracle merge into语句(merge into Statement)

在Oracle中,常规的DML语句只能完成单一功能,,例如insert/delete/update只能三选一,而merge into语句可以同时对一张表进行更新/插入/删除。

目录

一、基本语法

二、用法示例

2.1 同时更新和插入

2.2 where子句

2.3 delete子句

2.4 记录同步错误


、基本语法

merge into常用在数据同步的场景,它会选定一张基表作为数据源,然后与目标表的记录进行匹配,根据匹配的结果,可以对目标表同时进行更新/插入/删除操作。

语法:

MERGE INTO target_table
USING source_table ON (join_condition)
WHEN MATCHED THEN UPDATE SET … [WHERE …] [DELETE … WHERE …]
WHEN NOT MATCHED THEN INSERT (column_list) VALUES (value_list) [WHERE …]
LOG ERRORS INTO … REJECT LIMIT [integer|UNLIMITED]
  • target_table 是要更新的表
  • source_table 是参考表
  • USING … ON () 是两个表的连接条件,用于判断记录是否匹配
  • WHEN MATCHED 对于满足匹配条件的记录进行的操作,可以更新或删除
  • WHEN NOT MATCHED 对于不满足匹配条件的记录,可以插入
  • LOG ERRORS INTO 可以将匹配错误的记录记录到日志表中

二、用法示例

先创建2张表,一张源表,一张目标表:

create table src_table(
id number(6),
name varchar2(32),
salary number(6),
bonus number(6));

insert into src_table values(1,'Vincent',1000,100);
insert into src_table values(2,'Victor',2000,200);
insert into src_table values(3,'Grace',3000,300);


create table tgt_table(
id number(6),
name varchar2(32),
age number(6),
salary number(6),
bonus number(6));

insert into tgt_table values(1,'someone',1,0,0);
insert into tgt_table values(3,'someone',3,0,0);
insert into tgt_table values(4,'someone',4,0,0);
commit;

两张表的数据如下:

Select * from src_table;
Select * from tgt_table;

2.1 同时更新和插入

下面是最基本的用法,利用源表对目标表同时进行更新和插入

merge into tgt_table t
using src_table s on (t.id=s.id)
when matched then update set t.name=s.name, t.salary=s.salary, t.age=10
when not matched then insert values(s.id,s.name,10,s.salary,s.bonus+50);

commit;

select * from tgt_table;

  • When matched 为匹配存在的记录(id为1,3),更新了name, salary, age个字段
  • When not match 为目标表不存在的记录(id为2),插入了该记录,同时bouns字段加50
  • Matched 和 not matched的子句是独立的,可以任意选择一项,或同时出现
  • 目标表中id为4的记录在源表中不存在(不满足连接条件),因此不会涉及

2.2 where子句

对于匹配的记录,可以使用where子句进一步限制范围

merge into tgt_table t
using src_table s on (t.id=s.id)
when matched then update set t.bonus=s.bonus where s.id>=2;

Select * from tgt_table order by id;

  • 这里对匹配的记录bonus字段进行更新,同时进一步限制id>=2的记录才更新
  • Where 子句的条件可以通过源表或者目标表指定,这里是通过源表的s.id指定

2.3 delete子句

在update子句后,还可以跟上delete … where …子句,对匹配上的记录进行删除操作

merge into tgt_table t
using src_table s on (t.id=s.id)
when matched then update set t.bonus=s.bonus+50 where s.id>=3 delete where id>=2;

select * from tgt_table order by id;

  • delete where id>=2 指定将ID大于等于2的记录删除,但注意id为2的记录并未被删除,只有3被删除了
  • 因为delete只会在update匹配的到记录范围内删除,update子句有个where s.id>=3,delete也会受到这个条件的限制
  • 实际执行的效果是 delete where s.id>=3 and id>=2,只有id为3的记录满足这个条件
  • id为4的记录不在匹配范围内,不受merge into语句的影响,也不会被删除

2.4 记录同步错误

数据同步的时,源表和目标表的结构/数据类型/约束可能并不一致,这就导致数据同步可能部分失败,现在我们修改tgt表,限制salary字段值不能超过3000,即插入超过3000的数字将失败:

Alter table tgt_table modify salary number(6) check(salary<=3000);

首先调用dbms_errlog.create_error_log为tgt_table创建一张错误日志表,表名为errlog:

exec dbms_errlog.create_error_log('tgt_table', 'errlog');

  • 第一个参数指定要创建错误日志的基表,第二个参数是错误日志表名

然后在执行merge into 语句时,在最后跟上log errors into子句,如果语句执行过程中遇到错误,则会将错误记录到错误日志中,方便后期排查和修复,这里将tgt_table清空,尝试将src_table的3条数据同步进去,同时salary增加1000

truncate table tgt_table;

merge into tgt_table t
using src_table s on (t.id=s.id)
when not matched then insert values(s.id,s.name,10,s.salary+1000,s.bonus)
log errors into errlog('something is wrong.');

select * from tgt_table;

  • 这里将tgt_table表清空,然后尝试将src_table中的3条记录同步进来,同步过程中我们将salary增加了1000
  • 因为tgt_table表salary有约束不能超过3000,因此语句回滚,一条记录都没同步进来
  • errlog中的'something is wrong.' 是用户定义的错误标记,可以帮助识别是哪个语句导致的错误

查询errlog表,可以看到导致失败的原因,id为3的记录,salary在增加1000后为4000,违反了目标表的约束(check salary<=3000):

select * from errlog;

如果我们不想让出现错误的时候语句就回滚,可以在后面跟上一个reject limit N子句,限制只有出现N个以上的错误时才回滚语句:

merge into tgt_table t
using src_table s on (t.id=s.id)
when not matched then insert values(s.id,s.name,10,s.salary+1000,s.bonus)
log errors into errlog('Allow one error.') reject limit 1;

select * from tgt_table;

  • 我们在上面的语句后面增加了1个reject limit 1子句,当出现1个及以下的错误时,并不会回滚
  • 因此id为1和2的记录成功插入,语句并未报错
  • errlog的用户标记修改为'Allow one error.'

再次查询errlog

select * from errlog;

  • 通过Allow one error标签,我们发现ID为3的记录因违反约束没有被插入
  • 但这此有reject limit 1子句,语句允许出现1个及以下错误,因此满足条件的记录被成功插入
  • 如果选择reject limit unlimited,则不限制错误数量

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

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

相关文章

数据库Delete的多种用法

数据库的Delete操作是用来删除数据库中的数据记录的&#xff0c;它是数据库操作中的一种重要操作&#xff0c;能够帮助用户删除不需要的数据&#xff0c;以便保持数据库的整洁和高效。在使用Delete操作时&#xff0c;需要注意确保操作的准确性和安全性&#xff0c;以免误删重要…

[JavaScript前端开发及实例教程]计算器井字棋游戏的实现

计算器&#xff08;网页内实现效果&#xff09; HTML部分 <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>My Calculator&l…

Ruff智能物联网网关助力工厂数智化运营,实现产量提升5%

数字化转型是大势所趋&#xff0c;以工业互联网为代表的数实融合是发展数字经济的重要引擎&#xff0c;也是新质生产力的一大助力。工业互联网是新工业革命的重要基石&#xff0c;加快工业互联网规模化应用&#xff0c;是数字技术和实体经济深度融合的关键支撑&#xff0c;是新…

回归预测 | MATLAB实现CNN-BiLSTM(卷积双向长短期记忆神经网络

效果一览 基本介绍 提出一种同时考虑时间与空间因素的卷积&#xff0d;双向长短期记忆&#xff08; CNN-BiLSTM&#xff09;模型&#xff0c;将具有空间局部特征提取能力的卷积神经网络&#xff08;CNN&#xff09;和具有能同时考虑前后方向长时间信息的双向长短期记忆&#xf…

JavaScript基础知识21——for循环

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 今天学习for循环&#xff0c;以下为学习笔记。 1、while循环和for循环有啥不同&#xff1f; 1.1、在实际开发中&#xff0c;while循环用来解决循环次数不确定时使用&#xff0c;当一个循环不确定会循环多少次时&#…

【每日OJ —— 94. 二叉树的中序遍历】

每日OJ —— 94. 二叉树的中序遍历 1.题目&#xff1a;94. 二叉树的中序遍历2.解法2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目&#xff1a;94. 二叉树的中序遍历 2.解法 2.1.算法讲解 1.首先如果在每次每个节点遍历的时候都去为数组开辟空间&#xff0c;这样的效率太低…

OWASP安全练习靶场juice shop-更新中

Juice Shop是用Node.js&#xff0c;Express和Angular编写的。这是第一个 完全用 JavaScript 编写的应用程序&#xff0c;列在 OWASP VWA 目录中。 该应用程序包含大量不同的黑客挑战 用户应该利用底层的困难 漏洞。黑客攻击进度在记分板上跟踪。 找到这个记分牌实际上是&#…

【PyTorch】tensorboardX的安装和使用

文章目录 1. tensorboardX的安装2. tensorboardX的使用 tensorboardX是一种能将训练过程可视化的工具 1. tensorboardX的安装 安装命令&#xff1a; pip install tensorboardXVSCode集成了TensorBoard支持&#xff0c;不过事先要安装torch-tb-profiler&#xff0c;安装命令&…

文件管理和操作工具Path Finder mac功能介绍

Path Finder mac是一款Mac平台上的文件管理和操作工具&#xff0c;提供了比Finder更丰富的功能和更直观的用户界面。它可以帮助用户更高效地浏览、复制、移动、删除和管理文件&#xff0c;以及进行各种高级操作。 Path Finder mac软件功能 - 文件浏览&#xff1a;可以快速浏览文…

如何购买华为云服务器

华为云是华为推出的云计算服务平台&#xff0c;旨在为企业和个人提供全面的云端解决方案。它提供了包括计算、存储、数据库、人工智能、大数据、安全等多种云服务&#xff0c;覆盖了基础设施、平台和软件级别的需求。华为云致力于构建安全可信赖的云计算基础设施&#xff0c;以…

vite初识

Vite是伴随着Vue3正式版一起发布的&#xff0c;最开始Vite 1.0的版本是为Vue3服务的&#xff0c;并不是跨框架的。之后半年时间左右&#xff0c;出现了Vite 2.0版本&#xff0c;Vite 2.0真正脱离了和Vue3的强关联&#xff0c;以插件的方式&#xff0c;可以集成到目前流行的主流…

【每日一题】到达首都的最少油耗

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;贪心深搜 写在最后 Tag 【递归/深度优先搜索】【树】【2023-12-05】 题目来源 2477. 到达首都的最少油耗 题目解读 每个城市都有一位代表需要前往城市 0 进行开会。每个城市都有一辆座位数为 seats 的汽车&#xff0…

2023.12.4 关于 Spring Boot 统一异常处理

目录 引言 统一异常处理 异常全部监测 引言 将异常处理逻辑集中到一个地方&#xff0c;可以避免在每个控制器或业务逻辑中都编写相似的异常处理代码&#xff0c;这降低了代码的冗余&#xff0c;提高了代码的可维护性统一的异常处理使得调试和维护变得更加容易&#xff0c;通…

Python智能语音识别语翻译平台|项目后端搭建

Python程序设计基础&#xff0c;第三方库Django、requests、hashlib、pyttsx3等的使用&#xff0c;百度API语音识别业务接口、文本朗读业务接口、翻译业务接口的传入。 01、任务实现步骤 任务描述&#xff1a;本任务利用Django框架搭建智能语音识别与翻译平台的后端&#xff0…

leetcode:统计感冒序列的数目【数学题:组合数含逆元模版】

1. 题目截图 2.题目分析 需要把其分为多个段进行填充 长为k的段&#xff0c;从两端往中间填充的方案数有2 ** (k - 1)种 组合数就是选哪几个数填哪几个段即可 3.组合数含逆元模版 MOD 1_000_000_007 MX 100_000# 组合数模板 fac [0] * MX fac[0] 1 for i in range(1, MX…

GPT-Crawler一键爬虫构建GPTs知识库

GPT-Crawler一键爬虫构建GPTs知识库 写在最前面安装node.js安装GPT-Crawler启动爬虫结合 OpenAI自定义 assistant自定义 GPTs&#xff08;笔者用的这个&#xff09; 总结 写在最前面 GPT-Crawler一键爬虫构建GPTs知识库 能够爬取网站数据&#xff0c;构建GPTs的知识库&#xf…

LeetCode //C - 221. Maximal Square

221. Maximal Square Given an m x n binary matrix filled with 0’s and 1’s, find the largest square containing only 1’s and return its area. Example 1: Input: matrix [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,…

计算机操作系统2

1.计算机操作系统的发展和分类 2.操作系统的运行机制 3.中断 3.1.中断&#xff08;关键作用&#xff09; 4.系统调用 5.操作系统的内核 6.操作系统的体系结构 7.开机过程&#xff08;操作系统引导&#xff09;

Vue3网站用户引导功能【Intro.js】

一、介绍 Intro.js 是一个用于创建网站用户引导、功能介绍和教程的 JavaScript 库。它允许开发者通过步骤和提示突出显示网站上的特定元素&#xff0c;以帮助用户更好地了解和使用网站的功能。以下是 Intro.js 的一些关键特点和用法介绍&#xff1a; 更多Intro.js 功能网址&a…

Hadoop学习笔记(HDP)-Part.08 部署Ambari集群

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …