ITPub博客

首页 > 数据库 > Oracle > merge into

merge into

原创 Oracle 作者:哎呀我的天呐 时间:2015-05-09 23:47:04 1 删除 编辑

点击(此处)折叠或打开

  1. create table base_tab (name varchar2(20),age number, address varchar2(100));
  2. insert into base_tab values('任我行',56,'山东');
  3. insert into base_tab values('风清扬',107,'湖南');
  4. insert into base_tab values('孙悟空',5000000,'湖北');
selet * from base_tab;


点击(此处)折叠或打开

  1. insert into up_tab values('姚明',1,30,'上海','上海交通');
  2. insert into up_tab values('范冰冰',2,40,'北京','文盲');
  3. insert into up_tab values('邵佳一',3,35,'北京','未知');
  4. insert into up_tab values('任我行',4,56,'山东','私塾');
  5. insert into up_tab values('任我行',5,32,'河北','不详');
  6. select * from up_tab

现在要将up_tab中的姓名,年龄,地址信息更新到base_tab中,如果基本表base_tab中没有更新表up_tab中的信息,那么就直接插入,如果有就按照up_tab进行更新。

点击(此处)折叠或打开

  1. merge into base_tab b
  2. using (select name,age,address from up_tab) u
  3. on (b.name=u.name)
  4. when matched then update set b.age=u.age,b.address=u.address
  5. when not matched then insert values(u.name,u.age,u.address);
ORA-30926: unable to get a stable set of rows in the source tables
违反约束条件了,merge在做update子句的时候,只能处理1对1或1对0的关系,不能处理多对1或多对多的关系,否则会导致ora-30926 错误。

之后删除id=5的数据,更新通过。


但是生成上基本不用merge into 更新插入表,如果要更新插入2000w行数据,其一是大事务产生undo多,其二会锁表,生产上使用游标更新,即每1000行更新。
update不如 merge的情况:(多表关联更新的情况)

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29990276/viewspace-1631837/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: cursor:pin S wait on X
下一篇: dbca删库的陷阱
请登录后发表评论 登录
全部评论
https://cloud.tencent.com/developer/inventory/14362

注册时间:2014-10-30

  • 博文量
    403
  • 访问量
    2528741