数据库设计问题,编程实现自动编号(50分)

  • 主题发起人 主题发起人 cxx1997
  • 开始时间 开始时间
C

cxx1997

Unregistered / Unconfirmed
GUEST, unregistred user!
有一关键字段(string类型 10),
由于需要允许用户修改或自己定义,另一方面又要能自动生成。
请问如何通过检索数据库来生成一个不重复得编码?
 
如果你不是一定要用SQL语句来实现的话,很简单。
每次写入新数据时,找到表中最大的一条数据,将该值加1后写入。
但是如何应付用户修改就是个问题了。在写入要修改的数据之前,
检查全表,如果有重复,就禁止更新记录。
 
要写触发器,当添加及删除时触发。如果用户参予修改,不能保证编号连续,
但可保证唯一。
 
以下sql可实现编码的自动生成(从1开始),并且保证基本连续,删除中间号还可以用此中间号
Select min(to_Number(col1))+1 from a
where to_Number(col1)+1 not in (Select to_Number(col1) from a)
and 1 in (Select to_Number(col1) from a)
如果允许用户修改,则必须在存盘之前select一下表,是否存在此编号。
 
如果用数据库 作一个字端,如果不用数据库可以考虑ini,注册表,具体不用再说了吧
 
字符串型得如何加一?
如‘aaa'可以加一吗??
用户指定,如10位,他指定一条为‘ZZZZZZZZZZ’(最大),我以后得记录怎么加??
各位,问题不简单得!
 
下面的代码可以实现
var
year,month,day:word;
begin
DecodeDate(Now,year,month,day);
with ADOQ_tempdo
begin
Close;
SQL.Clear;
SQL.Add('select Max(zyh) from dyszxzzyd where zyh<>''无号'' and dwbh='+''''+DepotID+'''');
Open;
if ADOQ_temp.Fields[0].AsString='' then
zyh:=IntToStr(year)+'0001'
else
if (year*10000)>ADOQ_temp.Fields[0].AsInteger then
zyh:=IntToStr(year)+'0001'
else
zyh:=IntToStr(ADOQ_temp.Fields[0].AsInteger+1);
end;
end;
 
function NumNOInc(NumNO:String):String;
var
TotalLength,i:Integer;
Number:Int64;
ZeroNo:String;
begin
TotalLength:=Length(NumNo);
Number:=StrToInt64(NumNo);
Number:=Number+1;
ZeroNo:='';
for i:=0 to TotalLength-Length(IntToStr(Number))-1do
begin
ZeroNo:=ZeroNo+'0';
end;
NumNOInc:=ZeroNo+IntToStr(Number);
end;
 
楼上各位好像都没有怎么考虑网络共享状状下两个用户同时找(或相隔时间非常近)
已有最大值时人,很可能会得到同一个结果,当它们被加1之后再写入数据库中就会
出现重复的编码了。
 
建议你参考lid=331077
 
多人接受答案了。
 
后退
顶部