序列到达最大值后如何处理,探讨探讨

kerisyml 2003-07-17 09:08:09
我定义了一个字段NJL_SN NUMBER(10,0),再创建序列
CREATE SEQUENCE NJL_SN
NOCYCLE
MAXVALUE 9999999999
START WITH 1000;
然后每插入一条记录,序列NJL_SN增加1;则如果数据增至9999999999时,而该表中的记录不能删除,且我创建的序列也不能循环(NOCYCLE),这时会出现错误ORA-08004: 序列NJL_SN.NEXTVAL exceeds MAXVALUE 无法实例化,请问,这时该如何处置?
当然开始的时候我设置NJL_SN为NUMBER(20,0),创建序列MAXVALUE为99999999999999999999,足够大,按常理是不大可能到达的,但是问题毕竟在此,没有什们不可能的事情,还有,如果序列创建的MAXVALUE创建的足够大,不知道是不是会占有空间,是否会延误数据库的速度等一系列问题?
当然我设置序列循环(Cycle)是可以一直循环下去,但是我们一般把创建的序列字段设置为主键PK的,这就又不允许循环。

不知道大家针对这种情况,是如何处理的?
我的意思是说万一字段值达到最大,而记录又唯一,不能删除,该如何处理,大家都是用什们办法解决的,我想银行里会很容易碰到这种情况的

...全文
1111 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kerisyml 2003-07-18
  • 打赏
  • 举报
回复
大家这样讨论讨论,真的不错,谢谢大家支持。
有什们感想继续
lilylamb 2003-07-17
  • 打赏
  • 举报
回复
我就使用hrb_qiuyb(大森林) 说的方法,系统的资源总是有限的,所以要在设计时注意了
kerisyml 2003-07-17
  • 打赏
  • 举报
回复
hammer_shi
你说的不错,找那些已经删除掉的数据,序列可以回收利用的再用,不过这有点困难,耗的时间和功夫反而变多了很多
hammer_shi 2003-07-17
  • 打赏
  • 举报
回复
哦,不好意思,没有看清。

hrb_qiuyb(大森林) 第二条说得不错。
我想了一下,觉得还是可以检索当前序列种空缺的重用。就是你到达某一个数值后,最后找在某一范围内的当前不存在的数值使用。不过要是你的数据量序列要用number(20),我的估计就行不通,主要速度跟不上。
呵呵,我觉得没那么恐怖吧?
hammer_shi 2003-07-17
  • 打赏
  • 举报
回复
哦,设置你认为尽可能大的值作为极限值。

不知道能不能满足楼主的要求,序列数值可以循环使用。
CYCLE item
Specify CYCLE to indicate that the sequence continues to generate values
after reaching either its maximum or minimum value. After an ascending sequence
reaches its maximum value, it generates its minimum value. After a descending
sequence reaches its minimum, it generates its maximum.
NOCYCLE item
Specify NOCYCLE to indicate that the sequence cannot generate more
values after reaching its maximum or minimum value. This is the default.
kerisyml 2003-07-17
  • 打赏
  • 举报
回复
hrb_qiuyb:
我觉得你第二点说的蛮好的,是一个非常好的方法,虽然每次生成的时候有点繁琐,但是不失为一个很好的方法。
欢迎大家继续讨论.......
kerisyml 2003-07-17
  • 打赏
  • 举报
回复
序列就是有利有弊,不能回退就是最大一缺点
hrb_qiuyb 2003-07-17
  • 打赏
  • 举报
回复
几点吧:
1、maxvalue设为很大其实也没什么关系的,当然不会点更多空间,因为它是存在数据字典中的一条记录,也没什么影响速度的可能,这个不必担心。
2、我认为你的设计有问题,也就是你对pk的设计有问题 ,你不能单单的用sequence生成的什就做为pk了,生成唯一值的方法很多的,
比如to_char(sysdate,'yyyymmddhh24miss')||to_char(sequence1.nextval),这时你可以把这个序列设为cycle了。
kerisyml 2003-07-17
  • 打赏
  • 举报
回复
刚才我在选择select seq.currval from dual的时候,
每次当我刚勇sql/plus登录进的时候,执行上面这个命令就提示错误:
ORA-08002: 序列seq.CURRVAL 尚未在此进程中定义
而如果我执行了select seq.nextval from dual;后,再执行
select seq.currval from dual;时,则可以执行并取出当前序列值了

不知道这又是怎么回事,
我查了一下,好像没人提过这个吗
beckhambobo 2003-07-17
  • 打赏
  • 举报
回复
CREATE SEQUENCE USERID INCREMENT BY 1 START WITH 1
MAXVALUE 1.0E28 MINVALUE 1 CYCLE
NOCACHE NOORDER;

select to_char(sysdate,'yyyymmdd') || lpad(USERID.nextval,4,'0') into :new.yyghno from dual;

一般这样设计,允许它循环,用日期限定它唯一
kerisyml 2003-07-17
  • 打赏
  • 举报
回复
qinminglei:
你这种说法的确是对的。
不过等发现这种问题了,才去解决,我觉得这说明在设计结构上
本身就有问题的,当然这个问题不大,用你这种方法可以轻易解决。
qinminglei 2003-07-17
  • 打赏
  • 举报
回复
如果事情已经发生了,就是说在生产数据库上,序列号已经达到最大值了。
可以删除此序列号,重建同名序列号,然后设置start with 和maxvalue.
这样就可以连续了。
总之在设计时就该考虑到这些问题。俺觉得序列号是有好处,但不要滥用,
俺觉得滥用序列号是一种取巧的方法了。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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