批量插入数据实现有则更新,无则插入

批量插入数据使用merge into实现有则更新,无则插入操作。

假设有这样一张表:

create table demo(
    fd_id varchar2(10 char) not null,
    fd_name varchar2(20 char),
    fd_age varchar2(3 char)
)

两种方式:

第一:使用中间表,数据先插入到demo_tmp这个中间表,之后在执行merge into

create table demo_tmp(
    fd_id varchar2(10 char) not null,
    fd_name varchar2(20 char),
    fd_age varchar2(3 char)
)
merge into demo t
using (select * from demo_tmp) t1
on (t.fd_id = t1.fd_id)
when matched then
     update set
            t.fd_name=t1.fd_name,
            t.fd_age=t1.fd_age
when not matched then
     insert (t.fd_id, t.fd_name, t.fd_age) values(t1.fd_id, t1.fd_name, t1.fd_age)

第二:不使用中间表

merge into demo t
using (select count(fd_id) cou from demo where fd_id='1') t1
on (t1.cou > 0)
when matched then
     update set
            t.fd_name='测试name',
            t.fd_age='测试'
     where  t.fd_id='1'
when not matched then
     insert (t.fd_id, t.fd_name, t.fd_age) values('1','测试name','测试')

从效率上来说应该是使用中间表的速度会更快,毕竟不使用中间表的sql需要传入参数,循环执行,但是如果使用statement.addBatch(),statement.executeBatch批量操作,不使用中间表的速度会提高,但具体是那个效率更好,大家自己测试下。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值