在 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;
就好了 。