在oracle中使用merge into实现更新和插入数据

oracle中使用merge into

DUAL表解释

  • 在Oracle数据库中,dual是Oracle中的一个伪表,在Oracle数据库中的select语句的语法为:sql

    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表主要是用来选择系统变量或是求一个表达式的值。oracle

使用场景

  • 对数据库操做时,会存在这样的需求: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');这是能够这样:code

    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表便可,其余的使用方法相似。

原创不易,欢迎转载,转载时请注明出处,谢谢!
做者:潇~萧下
原文连接:http://www.javashuo.com/article/p-heyrwuyx-gx.htmlhtm

相关文章
相关标签/搜索