你没有必要保证主键连续性。就像SQL Server中一样。

解决方案 »

  1.   

    oracle中建序列的时候有个参数cache ,如果后面的数字是10,cache 10,系统可以将序列的下十个放到缓存中,加快处理速度,如果此时down机,系统将丢弃没使用的部分,导致跳号.如果将cache 设置为0,或nocache 系统将不把序列的值放到缓存中,这样可以避免跳号.此方法未经测试.
      

  2.   

    不用序列可以实现
    删除前取出字段的序号,如8,然后再删除
    update table set 字段一 = 字段一 -1 where 字段一 > 8
      

  3.   

    使用max(id)+1,就可以了,不过这种方法在字段多了以后耗资源,不可取!
      

  4.   

    在另外一个表中来完成记录增量,不要用序列,一些ERP中就是这样来实现的
      

  5.   

    gcs925(改变[1995]) ,有些应用必须这样,象银行的会计传票号就不能有跳号,发票编号都不允许有跳号的情况产生。这种应用下,只能使用新增表来做这种应用
      

  6.   

    to:  tyrone98(林林)谢谢你的答复。从业务角度讲,如果出现会计传票号被取消或删除的情况,怎么处理呢?后面的单子自动填充被删除的吗?在csdn见过几次类似的问题,一直不明白为什么有这方面的要求。
      

  7.   

    用rownum让前台看起来是连续的算了
      

  8.   

    用语句查询下一个可用的空号不就行了,不要用序列,序列用在事务里当事务回滚里也会跳号的。
    如你的表(XX)里有字段SNo为你要的主键(长度为8)要让每次生成的记录号连续可以用下面的语句。试试SELECT SUBSTR(MIN(A.SNo)+100000001,2) SNo FROM (SELECT '00000000' SNo FROM DUAL 
    Union All SELECT SNo FROM XX) A WHERE NOT EXISTS( SELECT 'X' FROM XX WHERE SNo=substr(A.SNo+100000001,2))
      

  9.   

    对了要保证表dual只有一条记录