转:

Oracle存在则更新,不存在则插入应用-merge

2017年01月11日 14:15:26 周星猩 阅读数 11354更多

分类专栏: Oracle
 
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

Oracle在9i引入了merge命令,

通过这个merge你能够在一个SQL语句中对一个表同时执行inserts和updates操作.
当然是update还是insert是依据于你的指定的条件判断的,Merge
into可以实现用B表来更新A表数据,如果A表中没有,则把B表的数据插入A表.
MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表

  1. MERGE INTO table_name alias1
  2. USING (table|view|sub_query) alias2
  3. ON (join condition)
  4. WHEN MATCHED THEN
  5. UPDATE table_name
  6. SET col1 = col_val1,
  7. col2 = col_val2
  8. WHEN NOT MATCHED THEN
  9. INSERT (column_list) VALUES (column_values);

在alias2中Select出来的数据,每一条都跟alias1进行 ON (join condition)的比较,如果匹配,就进行更新的操作(Update),如果不匹配,就进行插入操作(Insert)。

因此,严格意义上讲,“在一个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中alias2的记录数。”

实例:

T有a、b两个字段 a是主键。现在有记录(1001,2)要保存到T中,T中如果已经存在则更新字段b,没有插入。

  1. MERGE INTO T T1
  2.  
  3. USING (SELECT '1001' AS a,2 AS b FROM dual) T2
  4.  
  5. ON ( T1.a=T2.a)
  6.  
  7. WHEN MATCHED THEN
  8.  
  9. UPDATE SET T1.b = T2.b
  10.  
  11. WHEN NOT MATCHED THEN
  12.  
  13. INSERT (a,b) VALUES(T2.a,T2.b);

实例:

mybatist 中的sql:

    1. <insert id="mergeInto" >
    2.  
    3. MERGE INTO CATEGORY_EXPERT_GRADE T1
    4. USING ( select ${categoryFk} as a, ${expertFk} as b FROM dual) T2
    5. ON ( T1.CATEGORY_FK=T2.a and T1.EXPERT_FK=T2.b)
    6. WHEN MATCHED THEN
    7. UPDATE SET T1.GRADE = #{grade,jdbcType=VARCHAR}
    8. WHEN NOT MATCHED THEN
    9. insert (PK, CATEGORY_FK, EXPERT_FK,GRADE, SAVE_DATE, FLAG,EXTEND1, EXTEND2, EXTEND3)
    10. values (Sequence_Shzj.nextval, #{categoryFk,jdbcType=DECIMAL}, #{expertFk,jdbcType=DECIMAL},
    11. #{grade,jdbcType=VARCHAR}, #{saveDate,jdbcType=DATE}, #{flag,jdbcType=DECIMAL},
    12. #{extend1,jdbcType=VARCHAR}, #{extend2,jdbcType=VARCHAR}, #{extend3,jdbcType=VARCHAR}
    13. )
    14.  
    15. </insert>

Oracle存在则更新,不存在则插入应用-merge的更多相关文章

  1. [转]Oracle存在则更新,不存在则插入

    原文:http://hi.baidu.com/mawf2008/item/eec8c7ad1c5be5ae29ce9da6 merge into a using bon (a.a=b.b)when m ...

  2. Oracle整合Mybatis实现list数据插入时,存在就更新,不存在就插入以及随机抽取一条记录

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 目录 Oracle整合Mybatis实现list数据插入时,存在就更新,不存在就插入 entity 对应表中字段,如不对应,在xml中起别名 map ...

  3. 3.数据库操作相关术语,Oracle认证,insert into,批量插入,update tablename set,delete和truncate的差别,sql文件导入

     1相关术语 语句 含义 操作 DML语句 (Data Manipulation Language) 数据库操作语言 insert update delete select DDL语言 (Date ...

  4. 认识oracle的update更新

    这两天给新同事安排了一个工作,即做一个update 的级联更新,在实际操作中发现了一个问题.就是对于Oracle的更新的语法,大部分人尤其是学过SqlServer的人在使用oracle的时候对于ora ...

  5. Oracle多表更新及MERGE命令和闪回机制还原数据表

    一.多表更新 比如线上有个系统由于某一个模块出现异常,导致系统整体的数据出现了错误,需要你手动改写数据库错误,Oracle update语句更新的值来自另一张表 update语法最基本的格式为 UPD ...

  6. Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence

    Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence 使用oracle11g插入数据时遇到这样一个问题: 1 --创建测试表-- 2 CREATE T ...

  7. 转 SSIS处理导入数据时, 存在的更新, 不存在的插入

    SSIS处理导入数据时, 存在的更新, 不存在的插入 分类: DTS/SSIS2006-09-10 12:43 18185人阅读 评论(22) 收藏 举报 ssissql servermicrosof ...

  8. 使用LKDBHelper 插入相同id时候应该是更新数据而不是插入新的数据

    要实现使用LKDBHelp 插入相同id时候应该是更新数据而不是插入新的数据 例如#import "JSONModel.h" @interface InfoModel : JSON ...

  9. Oracle + Entity Framework 更新没有设置主键的表

    最近用Entity Framework 开发的时候,发现一个问题,在默认情况下,EF不能对一个没有主键的表进行更新.插入和删除的动作. 那么,应该怎么处理没有主键的表呢? 我们打开这个表的edmx文件 ...

随机推荐

  1. Linux中安装配置启动关闭nginx等一系列动作

    Nginx简介 1.Nginx (engine x) 是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器: 2.Nginx 是由俄罗斯人 Igor Sysoev 采用C语言开发编写的 ...

  2. MySQL进阶19--函数的创建(举例)/设置mysql的创建函数的权限/查看(show)/删除(drop) / 举4个栗子

    /*MySQL进阶19 函数 存储过程和函数:都类似于java中的方法; 存储过程和函数通用好处: 1.提高代码的重用性 2.简化操作 好处: 减少操作次数,减少了编译次数,减少了和服务器的连接次数, ...

  3. Spring MVC 学习笔记(二)

    6. 视图和视图解析器  ❤  Spring MVC如何解析视图                                  • 请求处理方法执行完成后,最终返回一个ModelAndView对象 ...

  4. 数据库概念 MySQL语法

    数据库概念 将保存的数据部分,存到一个公共的地方,所有的用户涉及到数据相关都必须来这个公共地方查找 MySQL 本质就是一款基于网络通信的应用软件,任何基于网络通信的软件底层都是socket 可以把M ...

  5. STM32F10XX学习笔记的石墨连接

    https://shimo.im/docs/QHGRrWxbeb0NiBm9/ <STM32F10X系列笔记>,可复制链接后用石墨文档 App 打开

  6. 51NOD 1452 - 加括号

    DP预处理每个区间的值,再枚举括号位置就好了 #include <bits/stdc++.h> using namespace std; typedef long long ll; con ...

  7. javascript动态合并表格相同的单元格

    <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...

  8. javascript权威指南第22章高级技巧

    HTML <!DOCTYPE html> <html> <head> </head> <body> <div style=" ...

  9. 004_软件安装之_Altium Designer

    文件中有软件简单视频教程,安装有pdf教程 链接:https://pan.baidu.com/s/1ow-OHdsPuAyXCevjCVqEsg 提取码:l2rt 复制这段内容后打开百度网盘手机App ...

  10. Spring第四天

    顾问包装通知 通知(advice)是Spring中的一种比较简单的切面,只能将切面织入到目标类的所有方法中,而无法对指定方法进行增强 顾问(advisor)是Spring提供的另外一种切面,可以织入到 ...