MERGE INTO
TABLE_A
USING (...)
ON (...)
WHEN NOT MATCHED THEN
INSERT () VALUES (sequence.nextVal)
WHEN MATCHED THEN
UPDATE ...上面这个SQL, 如果只执行UPDATE的话,sequence也会被增长,这是为什么亚
TABLE_A
USING (...)
ON (...)
WHEN NOT MATCHED THEN
INSERT () VALUES (sequence.nextVal)
WHEN MATCHED THEN
UPDATE ...上面这个SQL, 如果只执行UPDATE的话,sequence也会被增长,这是为什么亚
id , name
1 aupdate tb set name = 'b' where id = 1是先删除id = 1的记录,然后插入id = 1 , name = 'b'
做了个试验
create sequence a_seq;
create table a as select rownum a1,rownum*2 a2 from dual connect by rownum<1000;
create table b as select rownum+300 a1,rownum*(-1) b1 from dual connect by rownum<300;--确定下当前的a_seq.nextval值
select a_seq.nextval from dual;merge into b using a
on (a.a1=b.a1)
when matched then
update set b.b1=a.a2
when not matched then
insert (b.a1,b.b1) values(a_seq.nextval,a.a2);--再看看
select a_seq.currval from dual;
--涨了999
--将merge句去掉update子句再执行一次
rollback;
merge into b using a
on (a.a1=b.a1)
when not matched then
insert (b.a1,b.b1) values(a_seq.nextval,a.a2);
--看看涨了多少
select a_seq.currval from dual;
--还是999,和a表的记录条数相同
可以看出,merge代码中,每读取a中的一条记录,就会解析一次when not matched中的insert语句,造成序列值增长。和update没有关系
但是这是没有意义的,因为如果将此句去掉,这个merge into里根本就没有序列
照目前的讨论下来的结果,变成这样了
有INSERT语句,当MATCH时,同样会执行一遍INSERT,造成 sequence.nextVal执行
所以我建议把INSERT语句去掉,同样应该是可以执行的
这样是不是可以理解成MERGE语句执行UPDATE时并不需要先执行INSERT一遍?
每比较一次,序列值也会增长