oracle sequence 不连续、相差太大问题

逐兔郎 2014-06-27 01:10:06
我用 sequence 生成主键,cache 值设为20 。发现了一个异常,那就是生成的主键不连续,比如说上个数字是4551552,下个就成了4552838 ,差别实在是太大了。我的代码里调用该 sequence.nextval 只有一处啊,没有其他地方调用 nextval 。
这期间数据库没挂掉过、也没宕机过。
这应该不是正常的跳号的现象吧,毕竟相差太大了啊?请问各位,这有可能是什么原因呢?
拜谢。。。
...全文
850 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
逐兔郎 2014-06-30
  • 打赏
  • 举报
回复
注: 上面的写的是在 ibatis 配置文件中。
逐兔郎 2014-06-30
  • 打赏
  • 举报
回复
引用 3 楼 wmxcn2000 的回复:
[quote=引用 2 楼 zhutulang 的回复:] [quote=引用 1 楼 wmxcn2000 的回复:] 看看你的步长,设置的是多少 ?


select  sequence_name, increment_by from user_sequences 

-- 看看 
是1 啊 会不会是 merge into 语句引起的啊?[/quote] 你提到了 Merge into ,那就有可能是这个问题。 比如你

select myseq.nextval from user_objects 这样一下子就会用 count(*) 这么多个。

-- 4551552,下个就成了4552838 
-- 这样解决就是通的。
[/quote] 结贴喽,可以确定是merge into 语句的问题了,如下这么写是有问题的: <insert id="updateOrInsertTableName" parameterClass="HashMap"> <![CDATA[ merge into tablename using (select count(*) count from tablename where condition1) numcount on (numcount.count <> 0) when matched then UPDATE SET A=A+1 WHERE condition2 when not matched then INSERT (ID,A,B,C,D) VALUES(tablename_SEQUENCE.NEXTVAL, #a#, #b#, #c#, #d# ) ]]> </insert> 正确的写法是这样: <insert id="updateOrInsertTableName" parameterClass="HashMap"> <selectKey resultClass="java.lang.Long" keyProperty="tableid"> <![CDATA[select tablename_SEQUENCE.NEXTVAL as tableid from dual]]> </selectKey> <![CDATA[ merge into tablename using (select count(*) count from tablename where condition1) numcount on (numcount.count <> 0) when matched then UPDATE SET A=A+1 WHERE condition2 when not matched then INSERT (ID,A,B,C,D) VALUES(tablename_SEQUENCE.NEXTVAL, #a#, #b#, #c#, #d# ) ]]> </insert> 虽然还不是很清楚,为什么第一种写法会造成那样的现象。。。
卖水果的net 2014-06-27
  • 打赏
  • 举报
回复
引用 2 楼 zhutulang 的回复:
[quote=引用 1 楼 wmxcn2000 的回复:] 看看你的步长,设置的是多少 ?


select  sequence_name, increment_by from user_sequences 

-- 看看 
是1 啊 会不会是 merge into 语句引起的啊?[/quote] 你提到了 Merge into ,那就有可能是这个问题。 比如你

select myseq.nextval from user_objects 这样一下子就会用 count(*) 这么多个。

-- 4551552,下个就成了4552838 
-- 这样解决就是通的。
逐兔郎 2014-06-27
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
看看你的步长,设置的是多少 ?


select  sequence_name, increment_by from user_sequences 

-- 看看 
是1 啊 会不会是 merge into 语句引起的啊?
卖水果的net 2014-06-27
  • 打赏
  • 举报
回复
看看你的步长,设置的是多少 ?


select  sequence_name, increment_by from user_sequences 

-- 看看 
AcHerat 2014-06-27
  • 打赏
  • 举报
回复
only a single sequence number can be generated for each row. In other words, if NEXTVAL is referenced more than once in a single statement, then the first reference generates the next number, and all subsequent references in the statement return the same number. 一些文档里的解释。
AcHerat 2014-06-27
  • 打赏
  • 举报
回复
要连续的话,不建议用这个,这个序列只要有用到都会自动去改变值,而且借用到的都是同样的值,你可以试试

create sequence t1;
create sequence t2;

select t1.nextval,t2.nextval from dual;
select t2.nextval from dual;
select t1.nextval from dual;

select t1.nextval,t2.nextval from dual;
select t1.nextval from dual;
select t2.nextval from dual;
看看就了解了。
  • 打赏
  • 举报
回复
1、 sequence.nextval 的使用 2、手动修改sequence的当前值
内容概要:本文档名为《赵家湾学校后大门一百三十六栋.txt》,实则是一份综合性科研仿真资源索引,集中展示了多个技术领域的Matlab/Simulink与Python代码实现项目。内容涵盖风光互补制氢合成氨系统容量-调度优化、微电网能量管理、无人机三维路径规划、图像分割、信号处理、电力系统建模、模型预测控制(MPC)、深度学习预测模型(如LSTM、Transformer)、联邦学习、强化学习应用等多个前沿方向。文档不仅列出具体研究题目和算法模型,还整合了智能优化算法(如PSO、GWO、DBO等)、路径规划、车间调度、通信优化、雷达跟踪、元胞自动机模拟等通用技术模块,并附有网盘链接提供完整代码与仿真模型下载,旨在为科研人员提供可复现的技术支持与开发参考。; 适合人群:具备一定编程基础,从事电气工程、自动化、计算机科学、人工智能、控制工程、能源系统等相关领域的研究生、科研人员及工程技术开发者。; 使用场景及目标:①辅助高水平学术论文复现与科研项目开发;②为硕士/博士论文、课程设计、学科竞赛提供算法实现与仿真建模支持;③提升在新能源并网、智能控制、路径规划、负荷预测、故障诊断等领域的工程实践与创新能力。; 阅读建议:此文档为资源导航型材料,建议结合个人研究方向筛选对应主题,通过提供的百度网盘链接获取完整代码包,并配合相关文献进行仿真实验与参数调试,以实现高效复用、二次开发与技术创新。

17,134

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧