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/xin1006/ 梦相随1006 同意,不得擅自转载本文,否则后果自负