Oracle_Sequence如何初始化开始值

 

Sequence的start with 值如何确定才能保证生成的主键不会冲突???

 

我的项目中最开始数据库表主键的生成策略是 increment,但由于后来采用了集群部署的方式,出现了主键冲突的问题. 故改为使用 Sequence生成.

 

<id name="id" column="id">
    <generator class="increment" />
</id>
<generator class="sequence">
    <param name="sequence">SEQ_RECEIPT_HIBERNATE</param>    
</generator>

 

统计数据库中,指定序列被哪些表的主键使用,故将全部最大值加起来作为序列的开始值+1,可以保证绝对不会冲突.

有些表中无数据,因此上要作判空处理.

 

1. 一个序列只被一个表使用时

-- MANTIS_CARD_LOG : OID
-- #### SEQ_RECEIPT_CARD_LOG ######---
--
select (case when max(l1.OID)   is null then 0 else max(l1.OID)   end) SEQ_RECEIPT_CARD_LOG_MAX  from MANTIS_CARD_LOG l1         
--
create sequence SEQ_RECEIPT_CARD_LOG
minvalue 1
maxvalue 9999999999999999999999
start with 1000000021
increment by 1
nocache;

 

 2. 一个序列被多个表使用时

--MANTIS_CARD_INFO:OID
--MANTIS_CARD_REP_INFO:OID
-- #### SEQ_RECEIPT_CARD ######---
--
  select (c1c1.c1Max + c2c2.c2Max  ) SEQ_RECEIPT_CARD_MAX
  from 
    (select (case when max(c1.OID)   is null then 0 else max(c1.OID)   end) c1Max  from MANTIS_CARD_INFO          c1) c1c1,
    (select (case when max(c2.OID)   is null then 0 else max(c2.OID)   end) c2Max  from MANTIS_CARD_REP_INFO      c2) c2c2
--
create sequence SEQ_RECEIPT_CARD
minvalue 1
maxvalue 99999999999999999999
start with 1000001
increment by 1
nocache; 

 

Hibernate主键生成策略参考文章:

Hibernate各种主键生成策略与配置详解

转载于:https://www.cnblogs.com/yangw/p/5492116.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值