Mybatis 中向 oracle 批量插入带有序列数据

本文介绍在Oracle数据库中使用INSERT ALL进行批量数据插入的方法,对比UNION ALL的效率,并解决主键冲突问题,通过触发器自动填充序列主键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 MySQL 中可以直接在 INSERT 后直接拼接多个记录实现批量插入 ,但这在 ORACLE 中不行 ,在大量插入的场景下 ,批量插入相比单条插入的效率提升极大 ,所以我们要使用批量插入 。

最开始使用的方法是 union all,但实际测试后觉得 union all 拼接的方法不如 insert all ,所以最后选用了 insert all 的方法

写出测试 sql 如下

insert all 
into test (id, name) values('1', 'lilei')
into test (id, name) values('2', 'xiaoming')
into test (id, name) values('3', 'xiaohong')
select 1 from dual;

等同于插入了三条语句 ,但是效率提示明显

测试完毕后修改生产代码 ,却一直报错 主键 违法唯一性约束 ,排查后发现源于主键使用了序列 ,在 insert all 中不能直接使用 seq.nextval 来调用主键

最后的解决方法是将主键用触发器添加 ,而不用语句添加 ,就可以避开 insert all 语句的这个问题

create or replace trigger tr_insert
before insert on test
for each row 
begin
    select SEQ_TEST.nextval into :new.ID from dual;
end;

之后就执行成功了

一点小提示 :

insert all 中语句最后一行的 select 1 from dual; 作用在于告诉数据库之前的每一条插入语句执行多少次 ,也就是说你使用 select 1 from dual;每条语句会执行 1 次 ,如果你开心的话 ,把语句改成 select 100 from dual; ,你会发现每条新增都被执行了 100 次 。这个 SELECT 可以随意 ,但是一定要有 ,推荐直接使用 select 1 from dual; 就好了 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值