如何生成这样的编号?(50分)

  • 主题发起人 主题发起人 thj
  • 开始时间 开始时间
T

thj

Unregistered / Unconfirmed
GUEST, unregistred user!
产生编号时,先补缺,再递增。如:已有编号1,2,4 按下增加即为3。如何实现?
 
你是用存储过程还是用delphi来实现?
 
你是要算法还是要代码?
 
给段代码学习一下!
 
数据量小的话,循环判断吧
数据量大的话,就应该有个非正常号码段的的管理。
if 非正常号码记录>0 then
begin
可用号码 := 使用非正常号码
删除这条“非正常号码”
end
else
可用号码 := 最大号码+1

而这个非正常号码段则是在用户号码分配未用,删除记录...可能产生号未跳号时记录入这张表
 
建一个专门存储断号码的表
产生一个断号码时插入一条:比如删除一条记录时
如果需要号码时从该表中取一条,并将该表中的记录删除,使该表与断号码保持同步
 
学过《数据结构》的都学过堆栈吧,可以用堆栈实现啊!
可以建一个回收编号的堆栈,把删除的编号都送入这个堆栈,然后生成编号
事可以先检查堆栈,如果有数据就取第一个记录做为编号,然后删除,
如果没有就新建一个编号。
堆栈可以用一个表来实现:)
这是非常好的算法!可以用来做大型的数据库系统。
如果要源程序可以与我练习: nibul@sina.com
 
堆栈方法?
我也要:
luodaan@163.net
 
难道没有实用的办法吗
 
用堆栈的方法很好理解,而且简单。
 
//Oracle的,SQL:
select min(ID) OldID from(
(select ID+1 ID from Table1 union select 1 ID from dual)
minus select ID from Table1
 
我也要啊,算我一份啦,softcool@163.net
谢谢~~~!
 
我也要一份,javens@163.net謝謝
 
SELECT TOP 1 ID,NEWID FROM
(SELECT ID,(SELECT COUNT(ID) FROM TABLE1 BBB WHERE BBB.ID<=AAA.ID) AS NEWID
FROM TABLE1 AAA ORDER BY ID) CCC
WHERE ID<>NEWID

思路是先对现存的记录进行排序,并给定连续序号
ID ID NEWID
1 1 1
2 => 2 2
4 4 3
然后再从中取出最小的ID<>NEWID的记录
最终得到的记录为
ID NEWID
4 3
此时新增编号就为NEWID,即为3
如果取出记录为空,说明前面没有断号,按当前最大编号递增即可
在ACCESS下通过,MS SQL请修改相应地方
 
为何要先补缺,再递增?
如果换一种方法,在删除时保持编号顺序不是很容易吗?
如已有编号1,2,3,4,在删除3时将4改为3。
 
to nibul:
我的邮箱是:ttapeng@163.com
 
to thj:
可以给分了:)
 
感谢各位朋友提供了多种方法.给分了!
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
824
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部