点击(此处)折叠或打开
- create table base_tab (name varchar2(20),age number, address varchar2(100));
- insert into base_tab values('任我行',56,'山东');
- insert into base_tab values('风清扬',107,'湖南');
- insert into base_tab values('孙悟空',5000000,'湖北');
![](http://img.blog.itpub.net/blog/attachment/201505/9/29990276_1431172489zQh0.png?x-oss-process=style/bb)
点击(此处)折叠或打开
- insert into up_tab values('姚明',1,30,'上海','上海交通');
- insert into up_tab values('范冰冰',2,40,'北京','文盲');
- insert into up_tab values('邵佳一',3,35,'北京','未知');
- insert into up_tab values('任我行',4,56,'山东','私塾');
- insert into up_tab values('任我行',5,32,'河北','不详');
- select * from up_tab
![](http://img.blog.itpub.net/blog/attachment/201505/9/29990276_1431173243W1X0.png?x-oss-process=style/bb)
现在要将up_tab中的姓名,年龄,地址信息更新到base_tab中,如果基本表base_tab中没有更新表up_tab中的信息,那么就直接插入,如果有就按照up_tab进行更新。
点击(此处)折叠或打开
- merge into base_tab b
- using (select name,age,address from up_tab) u
- on (b.name=u.name)
- when matched then update set b.age=u.age,b.address=u.address
- when not matched then insert values(u.name,u.age,u.address);
违反约束条件了,merge在做update子句的时候,只能处理1对1或1对0的关系,不能处理多对1或多对多的关系,否则会导致ora-30926 错误。
之后删除id=5的数据,更新通过。
![](http://img.blog.itpub.net/blog/attachment/201505/9/29990276_1431175096FRlF.png?x-oss-process=style/bb)
但是生成上基本不用merge into 更新插入表,如果要更新插入2000w行数据,其一是大事务产生undo多,其二会锁表,生产上使用游标更新,即每1000行更新。
update不如 merge的情况:( 多表关联更新的情况)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29990276/viewspace-1631837/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29990276/viewspace-1631837/