我在oracle数据库中,建了一个表,其中一个字段是用sequence的自增序列插入的,
但问题是当插入失败时,sequence的值依然会加1,所以得到的数据的最后结果会出现 
该字段的值在某些地方不连续,请问如何实现在插入失败时,序列的值不增加,而在插入
成功时加1,该字段要得到连续的值,中间不能有空缺啊!!!
盼回复,不胜感激!!!

解决方案 »

  1.   

    让序列不加一是不可能的
    但是你为什么要得到连续的值呢?用序列目的是让该字段数据唯一吧?
    要是你一定要得到连续的值,你可以另外加个字段(如:rn number(10)),在每次插入数据后
    update your_table_name set rn=rownum
      

  2.   

    如果要连续,又不考虑并发和效率问题,可以用max你插入的时候,赋于该字段 = select max(字段) + 1 from 表;
      

  3.   

    解决你这个问题不好用系列,只能用一个ID来记录
    每次新增的ID为
    declare newID number
    select max(id)+1 into newID from tb;
      

  4.   

    不要用sequence啊,自己设置一个自增的NUMBER就行了,用sequence也会出现很多其它问题
      

  5.   

    方法一:drop + create 
    方法二:循环nextval 
    方法三:序列从i改为j,设置增量为j-i,执行nextval,改回增量
      

  6.   

    select max(id)+1 into newID from tb for update
    这样能保证ID连续,并且并发不会有问题
    但牺牲了性能
    如果你操作的用户多,那大家都会抓狂
    实际上用序列是很少的方式,连续编号有那么重要吗?
      

  7.   

    是阿,在性能和需要连续性中选择一个吧。
    其实序列无非也就是生成唯一的值,而不一定强调连续;
    如果需要连续 可以考虑游标,设置一个i值,每次提交都自己加一
    例如
    for i in 1..999999 loop
    insert into table_a
    select i,xx from table_b
    commit;
    end loop;
    如果下次执行前先把 max 找出来,然后继续 从该值开始i+1