在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;
随机推荐
- Java原子变量类需要注意的问题
在学习多线程时,遇到了原子变量类,它是基于 CAS 和 volatile 实现的,能够保障对共享变量进行 read-modify-write 更新操作的原子性和可见性.于是我就写了一段代码试试,自认为 ...
- 机器学习(ML)七之模型选择、欠拟合和过拟合
训练误差和泛化误差 需要区分训练误差(training error)和泛化误差(generalization error).前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现 ...
- Spark API 之 map、mapPartitions、mapValues、flatMap、flatMapValues详解
原文地址:https://blog.csdn.net/helloxiaozhe/article/details/80492933 1.创建一个RDD变量,通过help函数,查看相关函数定义和例子: & ...
- k8s 开船记-全站登船:Powered by .NET Core on Kubernetes
今天 18:30 左右,我们迈出了 kubernetes 航行的关键一步——全站登船,完成了全站应用从 docker swarm 集群向 k8s 集群的切换,以前所未有的决心与信心重新开起这艘巨轮,而 ...
- vi/vim编辑器操作梳理
1. vi/vim编辑器详细使用讲解 1.1 vi/vim编辑器的3种模式 1.2 vi/vim编辑器操作说明 参数/命令/模式 说明 ###普通模式 :set nu 显示行号 :set non ...
- asp.net MVC项目开发之统计图的使用(前言)
接触这个项目,是项目组长已经完成了多数需求,并且有2个项目需要完工的情况下,让我加入,给了我2个表格,让我去设计出统计图. 第一次做统计图,可以说没有任何经验,不知道该如何下手,表格的数据量 ...
- 学习css常用基本层级伪类属性选择器
常见的css选择器包含:常用选择器.基本选择器.层级选择器.伪类选择器.属性选择器,其中常用选择器分为:1.html选择符*{}//给页面上所有的标签设置模式:2.类选择符.hcls{}//给clas ...
- C++中字符常量与字符常量不能直接相加
定义string变量,并进行初始化,如下: string s1 = "Hello"; string s2 = s1 + "World"; string s3 = ...
- tensorflow安装问题
环境 windows7 开始的时候,打算在最新版本下安装tensorflow体验下,python是3.6 anaconda是最新的5.0.1 结果执行 pip3 install --upgrade ...
- 【Android】WebDav For Android
最近在写一个云备份功能,参考了一下市面上的软件,发现有一种采用WebDav协议的云备份成本比较低,故特地研究一下使用. 服务器提供商是使用国内的坚果云,还是非常良心的. 坚果云官网:https://w ...