Oracle_Sequence如何初始化开始值
2016-05-14 10:55
781 查看
Sequence的start with 值如何确定才能保证生成的主键不会冲突???
我的项目中最开始数据库表主键的生成策略是 increment,但由于后来采用了集群部署的方式,出现了主键冲突的问题. 故改为使用 Sequence生成.
统计数据库中,指定序列被哪些表的主键使用,故将全部最大值加起来作为序列的开始值+1,可以保证绝对不会冲突.
有些表中无数据,因此上要作判空处理.
1. 一个序列只被一个表使用时
2. 一个序列被多个表使用时
Hibernate主键生成策略参考文章:
我的项目中最开始数据库表主键的生成策略是 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各种主键生成策略与配置详解
相关文章推荐
- oracle数据库的静默(Quiesce)状态
- 【知识积累】Oracle数据库安装配置
- oracle 添加服务
- Oracle---PLSQL案例
- oracle表分区详解
- Oracle中sql语言简洁教程----不动产数据迁移篇
- 处理Oracle数据中的无效对象
- Oracle11gR2下搭建DataGuard主备同步详解
- SQL server 和Oracle 序列
- Oracle安装临时客户端使用总结
- ORACLE日期时间函数大全
- Navicat连接Oracle详细教程
- 安装oracle数据库后的几步操作
- Oracle触发器详解
- 一套Oracle SQL练习题及答案
- oracle存储过程,集合对象处理
- Oracle 'no privileges on tablespace 表空间名称' 问题解决
- ORA-01033:ORACLE initialization or shutdown in progress
- 导入oracle数据泵导出的文件
- Oracle 使用基础(命令笔记)