开发环境
名称 | 版本 |
---|---|
操作系统 | Windows 10 X64 |
Oracle | win64_11gR2_database |
PLSQL Developer | 11.0.4.1788(64 bit)01.179332 - Unlimited user license |
参考
问题描述
公司的项目,有个功能每次使用需要向数据库插入很多数据,导致数据库并发量过大报错。
于是我采用 insert all
的方式一次性插入多条数据。
但是出现了新问题,由于 ID
字段是使用序列来进行自增的, insert all
多条数据时,序列生成的 ID 重复。
例如:
insert all
into cux.cux_ce_payment_write_off(WRITE_OFF_ID) values(cux.CUX_CE_PAYMENT_WRITE_OFF_S.nextval)
into cux.cux_ce_payment_write_off(WRITE_OFF_ID) values(cux.CUX_CE_PAYMENT_WRITE_OFF_S.nextval)
select 1 from dual;
commit;
结果:
WRITE_OFF_ID |
---|
10019 |
10019 |
解决办法
- 先把序列查出来赋值给对应字段,怎么一次性查询多个序列呢
-- 一次获取多个序列
SELECT cux.CUX_CE_PAYMENT_WRITE_OFF_S.nextval FROM (
select level from dual connect by level <= 2
);
或者
-- 一次获取多个序列
select cux.CUX_CE_PAYMENT_WRITE_OFF_S.nextval from (
select 1 from dual
union all
select 1 from dual
)
或者
-- 一次获取多个序列(需要 all_objects 的权限)
select cux.CUX_CE_PAYMENT_WRITE_OFF_S.nextval from (select 1 from all_objects where rownum <= 2)
- 结果:
WRITE_OFF_ID |
---|
10020 |
10021 |