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各種主鍵生成策略與配置詳解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM