Mybatis 中向 oracle 批量插入帶有序列數據

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章