oracle可以用sequence 实现自增长,但有一个问题当id与一个sequence设定后,insert into 中加入nextvalue可以自增长,但是如果因为某种原因失败 rollback了insert into操作,但是sequence已经加1,就造成了id跳号,有没没办法使当rollback后,sequence的nextvalue不增长!!

解决方案 »

  1.   

    用异常处理,在执行失败的时候执行rollback同时把序列删掉从建,从你需要的那 个数开始
    不过建议不要这样,这样就失去了使用序列的意义,搞不好会出现重复的序号
      

  2.   

    完全没有必要连号啊.sequence的最大值是足够
    足够足够足够足够足够足够足够你用的.
      

  3.   

    如果一定需要连号,建议不要用sequence做
      

  4.   

    你不想跳号,只有用MAX实现,又要考虑并发问题
      

  5.   

    没办法。
    你这种要求完全是单机版数据库的设计思路,多用户同时操作数据库你的要求是很难满足的。考虑以下情况:
    A申请了一个号码n
    B随后申请了一个号码n+1
    然后A业务失败,n号码作废
    然后C再申请号码返回什么?
    如果象你希望的那样在A失败后把nextvalue置为n的话,那C确实申请到了n,
    可是后面的人再申请的时候会继续申请到n+1,就出错了。真想不跳号业务又不出错很麻烦的,需要你每次申请号码时检查表中数据,或者你自己管理一个可用号码表
    会增加很多处理,造成你的程序效率降低,程序复杂之后故障率提高而且就算是这种情况下,仍然会有号码不连续的情况,试想下刚刚举的例子中A业务失败之后没有人继续申请号码的时候,你的数据库里n+1被占用,n没有用上,仍然是不连续的。
    当然,如果真的有一种病态的心理想让它不跳号,你可以整理下,把n+1全部改成n
      

  6.   

    如果不想跳号,那就不用序列,而每在新增一条语句时,先select  出这个ID 的max值加上1
    作为新的ID
      

  7.   

    看这里http://fronkx.blog.hexun.com/17331585_d.html
      

  8.   

    MAX+1 不可取,B/S模式,多用户申请,有并发问题!!
      

  9.   

    连号通过SQ无法实现,MAX(KEY)+1,只能先锁记录。
      

  10.   

    财务中,某些时候的确不能跳号
    简单的方法用max+1,考虑并发,用select max for update 锁记录
    复杂的方法,你可以自己考虑一个形如序列的东西,给他一个缓冲,失败的时候回滚。