zoukankan      html  css  js  c++  java
  • 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 同意,不得擅自转载本文,否则后果自负
  • 相关阅读:
    中国骨干网节点
    Linux命令整理
    centos6.5安装mysql
    mysql插入中文乱码问题
    Intellij Idea使用及配置
    IntelliJ IDEA像Eclipse一样打开多个项目
    IntelliJ IDEA14如何配置tomcat
    转:IntelliJ IDEA 2016.1.3注册破解激活
    IntelliJ Idea 快捷键
    CXF生成调用webservice的客户端
  • 原文地址:https://www.cnblogs.com/xin1006/p/5492116.html
Copyright © 2011-2022 走看看