MERGE INTO 使用时注意唯一冲突
1 用处:当需要对大量数据做“有则更新,无则插入”时,可以用到
(具体使用可参考链接http://space.itpub.net/25313300/viewspace-700222)
2 语法结构:
MERGE INTO TAB_target t
USING (SELECT
s.*
from TAB_source s) s
ON (t.APPL_NO = s.APPL_NO)
WHEN MATCHED THEN UPDATE
SET t.CITY = s.CITY
WHEN NOT MATCHED THEN
INSERT
(t.APPL_NO,t.CITY)
VALUES
(s.APPL_NO,s.CITY)
;
3 注意:
梳理一下这里的merge into的执行逻辑,(1)在merge into 之前将目标表tab_target的状态会记录下来,作为被匹配的对象,如有哪些 APPL_NO,
(2) using查询出来的结果集就会作为匹配的数据去根据条件appl_no与目标表比对,如果对上,即有记录,就更新,如果没有,就插入。
(3) 要注意,由于这里匹配的是merge into之前的状态,如果appl_no在target表中有唯一约束,而tab_source表查询出来的结果集中有重复的appl_no,那么结果集中居于后面的appl_no就会在比对的时候被当作没对上处理,插入进去后又会报唯一键冲突错误。所以,请保证数据集的唯一性。
4 链接:另外如果要在merge into中的update或select语句中添加where条件也是可以的,可以查看(http://blog.csdn.net/u011348602/article/details/9277983)