Oracle-一次插入多条数据(insert all)导致序列ID重复的问题解决

2023年09月22日 18:33 · 阅读(1020) ·

开发环境

名称 版本
操作系统 Windows 10 X64
Oracle win64_11gR2_database
PLSQL Developer 11.0.4.1788(64 bit)01.179332 - Unlimited user license

参考

Oracle一次获取多个序列值

Oracle一次插入多条数据(insert all)

问题描述

公司的项目,有个功能每次使用需要向数据库插入很多数据,导致数据库并发量过大报错。
于是我采用 insert all 的方式一次性插入多条数据。
但是出现了新问题,由于 ID 字段是使用序列来进行自增的, insert all 多条数据时,序列生成的 ID 重复。

  • 例如:

    1. insert all
    2. into cux.cux_ce_payment_write_off(WRITE_OFF_ID) values(cux.CUX_CE_PAYMENT_WRITE_OFF_S.nextval)
    3. into cux.cux_ce_payment_write_off(WRITE_OFF_ID) values(cux.CUX_CE_PAYMENT_WRITE_OFF_S.nextval)
    4. select 1 from dual;
    5. commit;
  • 结果:

WRITE_OFF_ID
10019
10019

解决办法

  • 先把序列查出来赋值给对应字段,怎么一次性查询多个序列呢
  1. -- 一次获取多个序列
  2. SELECT cux.CUX_CE_PAYMENT_WRITE_OFF_S.nextval FROM (
  3. select level from dual connect by level <= 2
  4. );

或者

  1. -- 一次获取多个序列
  2. select cux.CUX_CE_PAYMENT_WRITE_OFF_S.nextval from (
  3. select 1 from dual
  4. union all
  5. select 1 from dual
  6. )

或者

  1. -- 一次获取多个序列(需要 all_objects 的权限)
  2. select cux.CUX_CE_PAYMENT_WRITE_OFF_S.nextval from (select 1 from all_objects where rownum <= 2)
  • 结果:
WRITE_OFF_ID
10020
10021