遇到一个关于序列的奇葩问题

liupeiran8 2015-01-04 05:19:29
CREATE SEQUENCE SEQ_RESULT
INCREMENT BY 1
START WITH 1
MAXVALUE 999999999999999999
MINVALUE 1
CACHE 100

这是序列的属性,该序列用于某张表的主键ID,现在出现的情况就是表内已经入库10267条数据,出现无法入库的问题。
最后找到原因是序列当前值变成了10012,导致主键冲突不能入库,问题很好解决,但是造成序列倒退的原因找不到:
1.没有手动更改过序列。2.有更改过系统时间,但是我后来自己试验更改系统时间,时间倒退,序列并没有倒退。
有没有人遇到过这种情况,分享分享啊。。。。。
...全文
135 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
binsweet 2015-01-05
  • 打赏
  • 举报
回复
SEQUENCE 的cache确实会导致跳号问题,比如cache为100,如果初次走到95,数据当掉了,下次重启时会从101开始。 你的序列只到10012,而数据库中的数据已经到了10267,原因只能有两种: 1、程序代码逻辑问题,仔细找,应该是一个非正常操作流程导致的逻辑问题; 2、有谁手动插入数据。
卖水果的net 2015-01-05
  • 打赏
  • 举报
回复
LZ 你这张表的ID ,是通过触发器方式从序列取的值的吗?如果不是,那就有人没有按你的规则在表中写数据了。 如果是,有点怪了,这个只可能大,小的可能性,没有。
liupeiran8 2015-01-05
  • 打赏
  • 举报
回复
引用 3 楼 binsweet 的回复:
SEQUENCE 的cache确实会导致跳号问题,比如cache为100,如果初次走到95,数据当掉了,下次重启时会从101开始。 你的序列只到10012,而数据库中的数据已经到了10267,原因只能有两种: 1、程序代码逻辑问题,仔细找,应该是一个非正常操作流程导致的逻辑问题; 2、有谁手动插入数据。
3Q,确实是这样,10012后的数据是测试人员手动导入的。
bw555 2015-01-04
  • 打赏
  • 举报
回复
使用cache的话,数据库会提前取出制定个数的值,在请求序列值的时候会随机从已经取出的值中选择一个返回 因此使用cache的时候取出的序列值有可能不是顺序产生的,可能会出现乱序的现象 但是这也不会发生主键冲突的,每个值只会被取出一次,想不通因为啥啊 没人改过序列,是否有人改过表中的数据呢,可以核实一下

17,086

社区成员

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

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