在oracle中使用merge into实现更新和插入数据
oracle中使用merge into
DUAL表解释
在Oracle数据库中,dual是Oracle中的一个伪表,在Oracle数据库中的select语句的语法为:
SELECT column_1, column_2, ... FROM table_name;
即在使用select语句时,如果没有表名,就没办法执行查询,而当我们想查看当前时间
sysdate
或者想计算出一个表达式例如2+3
的值的时候,如果没有表是无法执行操作的,故Oracle数据库出现了伪表dual的概念。--查询当前时间,如果后面不跟表,则无法查询,例如
SELECT sysdate ;
--正确写法
SELECT sysdate FROM daul;
特点:
- dual名词意思是对数,做形容词时是指二重的,二元的。
- 它是一个单行单列的虚拟表。
- Dual表是oracle与数据字典一起自动创建的一个表,这个表只有1列:DUMMY,数据类型为VERCHAR2(1),dual表中只有一个数据'X', Oracle有内部逻辑保证dual表中永远只有一条数据。
- Dual表主要用来选择系统变量或求一个表达式的值。
总结:dual表就是oracle与数据字典自动创建的一张表,这张表是一个单行单列的表,这个表只有1列:DUMMY,数据类型为VERCHAR2(1),dual表中只有一个数据'X', Oracle有内部逻辑保证dual表中永远只有一条数据。dual表主要是用来选择系统变量或是求一个表达式的值。
使用场景
- 对数据库操作时,会存在这样的需求:insert 或者 Update;
- 根据某一个条件(比如唯一索引,唯一主键等)查询数据库,如果数据库中存在该条数据,则更新,没有的话就将这条数据插入到数据库中。
- 传统用法:插入之前先select,根据结果来进行update或者insert;
- 现在:使用MERGE 命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据。
用法
单表
- 现有测试表Student下有属性sid、name、grade等。传入数据('1001','张三','95')。要求如果存在学号sid为'1001'的学生,则更新他的成绩,没有的话就插入到数据库中。
MERGE INTO Student S1
USING (SELECT '1001' as sid,'张三' as name,'95' as grade FROM dual) S2
on (S1.sid=S2.sid)
WHEN MATCHED THEN
UPDATE SET S1.name=S2.name,S1.grade=S2.grade
WHEN NOT MATCHED THEN
INSERT
(S1.sid, S1.name,S1.grade)
VALUES
(S2.sid, S2.name,S2.grade );
--具体解释
--USING 这里是我们需要跟数据库进行比较的数据,这里传入的数据为('1001','张三','95'),为了保证USING后面的select有数据,在这里使用了dual表。
--on后面是我们要比较的条件
--WHEN MATCHED THEN 当存在学号为‘1001’这样的数据时,选择将数据库中的这条数据更新
--WHEN NOT MATCHED THEN 当不存在这条数据时,将这条数据插入到数据库中。
原理:在使用using 时搜出来的结果逐条与on条件匹配,然后决定是update还是Insert。 当USING后面的sql没有查询到数据的时候,Merge Into语句是不会执行update和Insert操作的。因此需要保证USING 后面的SELECT有数据,可以使用DUAL表作为USING后的表。
注意点:在实际项目中,using表后边传入的数据,可以是前台传过来的对象,例如前台传过来Student(SID:'1001',NAME:'张三',GRADE:'95');这是可以这样:
MERGE INTO Student S1
USING (SELECT #{SID,jdbcType=VARCHAR} sid FROM dual) S2
on (S1.sid=S2.sid)
WHEN MATCHED THEN
UPDATE SET S1.name= #{NAME,jdbcType=VARCHAR},S1.grade=#{GRADE,jdbcType=VARCHAR}
WHEN NOT MATCHED THEN
INSERT
sid,name,grade)
VALUES
(#{SID,jdbcType=VARCHAR} #{NAME,jdbcType=VARCHAR},#{GRADE,jdbcType=VARCHAR})
--mabatis最后语句不能以‘;’结尾,否则会报 ‘无效字符’ 错误。
多表
- 使用多张表时,比如A 表中的id对应与B表中的aid,只需在USING中使用select语句时的FROM表改为B表即可,其他的使用方法类似。
原创不易,欢迎转载,转载时请注明出处,谢谢!
作者:潇~萧下
原文链接:https://www.cnblogs.com/manongxiao/p/12241833.html
在oracle中使用merge into实现更新和插入数据的更多相关文章
- oracle使用 merge 更新或插入数据
OracleCC++C# 总结下.使用merge比传统的先判断再选择插入或更新快很多. 1)主要功能 提供有条件地更新和插入数据到数据库表中 如果该行存在,执行一个UPDATE操作,如果是一个新行, ...
- Oracle中把一张表查询结果插入到另一张表中
1. 新增一个表,通过另一个表的结构和数据 create table XTHAME.tab1 as select * from DSKNOW.COMBDVERSION 2. 如果表存在: inse ...
- ORACLE中的MERGE语法使用记录
项目中使用到了Oracle的MERGE INTO语句,在这里简单记录下使用方法 使用场景如下: 存在对一张数据量很大的表,你需要对里面的大量数据进行更新,如果数据不存在,就进行插入的操作. 常规想到的 ...
- oracle 触发器,当一个表更新或插入时将数据同步至另个库中的某个表中
有两个表分别是 A用户下的 T_SRC_WEATHER_TSPG字段如图, B用户下的t_src_weather 表,如图: 要求,当A用户下的T_SRC_WEATHER_TSPG表有插入或者更新数据 ...
- Oracle中如何添加和修改包含日期的数据
平时我们在sql sverver中我们添加包含日期的数据时,是直接将日期变成日期格式字符串,但是在Oracle中就不行了, 那么,如何添加包含日期数据 如:在oracle执行insert语句 /** ...
- 关于Oracle中Sort Merge Join的改写
业务场景的问题,我们有一个刷CUBE的SQL,是Oracle环境,平时跑70多分钟, 但是最近突然不动了,这个SQL需要算累计值,比如年累计客户数量. 累计值是什么意思呢?我们使用下面的数据来说明问题 ...
- Oracle中通过Job实现定时同步两个数据表之间的数据
1.http://blog.csdn.net/sxdtzhaoxinguo/article/details/41040741 2.Oracle两个数据库定时执行插入: http://zhidao.ba ...
- Oracle中的阻塞锁SQL(阻塞在哪个数据上)
SELECT ( '节点 ' || a.inst_id || ' session ' || a.sid || ...
- Oracle中如何删除某个用户下的所有数据的方法
win+R打开cmd 使用dba身份登录: sqlplus sys/sys@orcl as sysdba; 然后使用dba身份删除某个用户: drop user apptdm_9y cascade;
随机推荐
- Pycharm2019.1.1永久破解
声明:不做商业用途,电脑系统win10专业版,亲测有效. 1,下载新版破解补丁+安装包 网盘链接 提取码:hn0u 下载补丁文件 jetbrains-agent.jar 并将它放置到 pycharm安 ...
- 如何在kalilinux上安装docker
如何在kalilinux上安装docker 0X00安装背景 在windows上安装docker使用未果后,便决定在kalilinux上安装一个docker 0X01安装步骤 分别在linux终端执行 ...
- Elemetary OS deepin-wine 版 微信 和 企业微信 输入框字体显示异常解决
Elemetary OS deepin-wine 版 微信 和 企业微信 输入框字体显示异常解决 最近体验了Elementary OS 这个系统, 话说我之前都是用的Manjora 的各个桌面版, 突 ...
- 域名解析服务-DNS
一.DNS概述 DNS(Domain Name System)即域名系统.它使用层次结构的命名系统.将域名和IP相互映射 在整个互联网环境中连接了数以亿计的服务器以及个人主机.其中大部分网站都使用了域 ...
- javascript 原生js对html元素的 增删改查 操作
'use strict'; class View{ constructor(){ } //创建html元素 addEl(fel, elemName, id, cls){ //创建一个元素 let el ...
- java 获取两个时间之前所有的日期
正序(2017-01-01 ~2019-xxxxx) package com.founder.util; import java.text.SimpleDateFormat; import java. ...
- KVM性能优化之CPU优化
前言 任何平台根据场景的不同,都有相应的优化.不一样的硬件环境.网络环境,同样的一个平台,它跑出的效果也肯定不一样.就好比一辆法拉利,在高速公路里跑跟乡村街道跑,速度和激情肯定不同... 所以,我们做 ...
- centos7.5下yum安装nginx-1.14.2
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm ...
- Git Gui for Windows下载(pull)的正确操作方法
- 解决github图片不显示的问题
修改hosts C:\Windows\System32\drivers\etc\hosts 在文件末尾添加: # GitHub Start 192.30.253.112 Build software ...