如何保证oracle自增主键的连续性?

eyoexply 2004-07-22 12:53:10
用序列后,可以自增,但是一旦删除记录后,就不能保证主键连续性了
要怎么做才能达到连续性呢?
...全文
389 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
mqmmx 2005-01-12
  • 打赏
  • 举报
回复
对了要保证表dual只有一条记录
mqmmx 2005-01-12
  • 打赏
  • 举报
回复
用语句查询下一个可用的空号不就行了,不要用序列,序列用在事务里当事务回滚里也会跳号的。
如你的表(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))
nebulaly 2005-01-12
  • 打赏
  • 举报
回复
用rownum让前台看起来是连续的算了
jiangx123 2005-01-12
  • 打赏
  • 举报
回复
搞什么啊,会计号即使是用掉也是存在的,就是声明作废,绝对不允许使用已用过的号码
怎么能自动自动填充上来?
lveyo 2005-01-12
  • 打赏
  • 举报
回复
要用触发器了
gucs 2004-07-25
  • 打赏
  • 举报
回复
to: tyrone98(林林)

谢谢你的答复。

从业务角度讲,如果出现会计传票号被取消或删除的情况,怎么处理呢?后面的单子自动填充被删除的吗?

在csdn见过几次类似的问题,一直不明白为什么有这方面的要求。
WilliamXiaoLiang 2004-07-24
  • 打赏
  • 举报
回复
顶一下!
QQ:390958177
Email:xiaol@chinaebiz.biz
tyrone98 2004-07-24
  • 打赏
  • 举报
回复
gcs925(改变[1995]) ,有些应用必须这样,象银行的会计传票号就不能有跳号,发票编号都不允许有跳号的情况产生。这种应用下,只能使用新增表来做这种应用
gucs 2004-07-24
  • 打赏
  • 举报
回复
请问,使序列连续有什么作用,谢谢
LGQDUCKY 2004-07-22
  • 打赏
  • 举报
回复
如果使用序列就没有办法实现,只能通过别的方法来实现
David1289 2004-07-22
  • 打赏
  • 举报
回复
在另外一个表中来完成记录增量,不要用序列,一些ERP中就是这样来实现的
magicnbh 2004-07-22
  • 打赏
  • 举报
回复
使用max(id)+1,就可以了,不过这种方法在字段多了以后耗资源,不可取!
fim 2004-07-22
  • 打赏
  • 举报
回复
不用序列可以实现
删除前取出字段的序号,如8,然后再删除
update table set 字段一 = 字段一 -1 where 字段一 > 8
freddy2003 2004-07-22
  • 打赏
  • 举报
回复
跳号肯定是不可避免的
如果你第一次是1,2,3,4,5,6,7,8,9
如果你第二次是把1,2,3,4删除
如果你第三次是10,12,13,


你能保证第二次删除瓣1,2,3,4不跳号吗?


其实我自已以前也是试着用触发器来实现,最后都是失败了
dinya2003 2004-07-22
  • 打赏
  • 举报
回复
oracle中建序列的时候有个参数cache ,如果后面的数字是10,cache 10,系统可以将序列的下十个放到缓存中,加快处理速度,如果此时down机,系统将丢弃没使用的部分,导致跳号.如果将cache 设置为0,或nocache 系统将不把序列的值放到缓存中,这样可以避免跳号.此方法未经测试.
freddy2003 2004-07-22
  • 打赏
  • 举报
回复
你没有必要保证主键连续性。就像SQL Server中一样。

17,377

社区成员

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

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