• 技术文章 >数据库 >Oracle

    oracle中merge into的用法是什么

    长期闲置长期闲置2022-03-02 13:47:24原创117

    在oracle中,“merge into”用于更新表中的数据,可以将一个表中的数据插入另一个表中,若被插入的表中已经有该数据则更新该数据,若没有该数据则会在被插入的表中新增数据。

    本教程操作环境:Windows10系统、Oracle 11g版、Dell G3电脑。

    oracle中merge into的用法是什么

    Oracle9g引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和update操作. MERGE命令从一个或多个数据源中选择行来update或insert到一个或多个表.在Oracle 10g中MERGE有如下一些改进:

    1、UPDATE或INSERT子句是可选的

    2、UPDATE和INSERT子句可以加WHERE子句

    3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表

    4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行

    5、源表就是using关键字后面跟的表,目标表就是将要被merge into的表

    6、merge into 中所有的update、insert、delete都是针对目标表来操作的。由于merge into已经制定了操作的表,所以update、insert、delete都不需要再显示指出表名

    7、总之,merge into的作用就是 解决用B表跟新A表数据,如果A表中没有,则把B表的数据插入A表或向一个表中插入数据,如果该表已有该数据则更新,反之新增数据。
    语法:

    MERGE INTO [your table-name] [rename your table here]  
      USING ( [write your query here] )[rename your query-sql and using just like a table]  
      ON ([conditional expression here] AND [...]...)  
      WHEN MATHED THEN [here you can execute some update sql or something else ]  
      WHEN NOT MATHED THEN [execute something else here ! ]

    接下来我们来直接进行测试:

    需求一:向一个表中插入一条数据,如果该表中已经有该数据则更新,反之新增

    首先创建一个表TEST_ONE

    create table TEST_ONE(
      ID   NUMBER not null
        primary key,
      NAME VARCHAR2(255),
      IP   VARCHAR2(255),
      MEMO VARCHAR2(255))commit;

    随便添加几条数据作为测试数据

    INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (1, '2', '3', '周文军');
    INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (2, '66', '366', '2656');
    INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (3, '5656', '626', '2626');
    INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (4, '5656', '2626', '626');

    好了,我们的数据表已经建成,如下图:
    在这里插入图片描述
    如果我们需要新增一条数据,一般会这样进行

    INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (5, 'mrhu', '127.0.0.1.0', '王先生的IP');

    但我们希望可以先用ID进行判断,没有该数据新增,有该数据更新,怎么实现呢?

    那么merge into命令来了,直接撸代码:

    merge into TEST_ONE mtb using (select '5' as id, 'mrhu' as name,'127.0.0.1.0' as ip,'王先生的IP' as memo from dual)mmb on (mtb.id = mmb.id)when matched THENupdate set mtb.name = mmb.name,mtb.ip = mmb.ip,mtb.memo=mmb.memo
    when not matched theninsert (mtb.id, mtb.name,mtb.ip,mtb.memo) VALUES(mmb.id,mmb.name,mmb.ip,mmb.memo);

    运行如下:
    在这里插入图片描述
    我们再来看看表中数据:
    在这里插入图片描述
    数据新增成功!

    那么我们如何测试更新呢?很简单,我们将memo=‘王先生的IP’ 改为 memo=‘本大美女的IP’来进行测试

    merge into TEST_ONE mtb using (select '5' as id, 'mrhu' as name,'127.0.0.1.0' as ip,'本大美女的IP' as memo from dual)mmb on (mtb.id = mmb.id)when matched THENupdate set mtb.name = mmb.name,mtb.ip = mmb.ip,mtb.memo=mmb.memo
    when not matched theninsert (mtb.id, mtb.name,mtb.ip,mtb.memo) VALUES(mmb.id,mmb.name,mmb.ip,mmb.memo);

    运行如下:
    在这里插入图片描述
    我们再来看看表中数据:
    在这里插入图片描述
    数据更新成功啦!

    需求二:将A表中的数据添加到B表中,要求通过主键来进行判断,如果包含该数据则更新,反之新增

    我们再创建一个表TEST_TWO作为表B,TEST_ONE作为表A

    create table tes(
      ID   NUMBER not null
        primary key,
      CODE VARCHAR2(255),
      MEMO VARCHAR2(255));commit;

    好了 表TEST_TWO建立好了,我们先来添加一条数据吧!

    INSERT INTO ROOT.TEST_TWO (ID, CODE, MEMO) VALUES (5, 'mrhu', '隔壁老王的IP');

    我们再看看TEST_TWO中的数据:
    在这里插入图片描述
    我们来将TEST_ONE中的数据导到我们新建的表中,通过分析,我们发现,TEST_TWO 表中有了一条数据,ID为5,TEST_ONE中也有一条ID为5的数据,预期执行效果为TEST_TWOID为5的数据的memo字段值将更新为TEST_ONE中的‘本大美女的IP’,其他值进行新增操作。

    我们写代码来验证一下:

    merge into TEST_TWO mtb using (select id,name,ip,memo from TEST_ONE) mmb on (mtb.id = mmb.id)when matched THENUPDATE set mtb.code = mmb.name,mtb.memo = mmb.memo
    when not matched THENinsert (mtb.id,mtb.code,mtb.memo) values (mmb.id,mmb.name,mmb.memo);

    我们来看看效果:
    在这里插入图片描述
    执行结果与预期结果一致,好了,merge into的用法你们学会了吗! 喜欢的关注支持一下!

    推荐教程:《Oracle视频教程

    以上就是oracle中merge into的用法是什么的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:oracle
    上一篇:oracle中for update的用法是什么 下一篇:oracle中using的用法是什么
    PHP编程就业班

    相关文章推荐

    • oracle怎么查询不包含指定字符• oracle怎么查询表的行数• oracle怎么修改表的值• oracle中substr的用法是什么• oracle replace()函数怎么用

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网