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

逐兔郎 2014-06-27 01:10:06
我用 sequence 生成主键,cache 值设为20 。发现了一个异常,那就是生成的主键不连续,比如说上个数字是4551552,下个就成了4552838 ,差别实在是太大了。我的代码里调用该 sequence.nextval 只有一处啊,没有其他地方调用 nextval 。
这期间数据库没挂掉过、也没宕机过。
这应该不是正常的跳号的现象吧,毕竟相差太大了啊?请问各位,这有可能是什么原因呢?
拜谢。。。
...全文
658 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的当前值

17,131

社区成员

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

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