Access表的一个小问题(50分)

  • 主题发起人 主题发起人 sleepy
  • 开始时间 开始时间
S

sleepy

Unregistered / Unconfirmed
GUEST, unregistred user!
现有一个表,其中有一数字型字段,
目前里面的值没有重复的,但不是严格递增的.我现在想把
这一字段变成自动的编号,但我又想保留这个字段里面原来
的数值,即不破坏原来表中的对应关系,自动编号从最大那
个数开始.我该怎么办?
例如 下表中的ID
ID name
1 张三
2 李四
4 .
6 .
. .
. .

 
我也想知道!
 
跟一下.也许有办法.
 
我只晓得MSSQL有个种子数的,导入MSSQL7再导回来?:)
 
想出了一个办法,虽然笨了点,但很实用,原理就是当自动增加的ID号不是你需要
的数时,就不停地"添加","删除",直到ID号变成你要的数为止:
下面是一个例子,用Access97+ODBC98实现,已经调试通过:
procedure TForm1.Button1Click(Sender: TObject);
var tqes,tqed:todbcquery;
ids,idd:integer;
//tqes是源表,即没有"自动增加"字段的那个表
//tqed是新表,注意在access中,这个表一定要是新创建的,
如果原来有记录即使删除也没用,因为原来的ID号已经记录下来了.
//假设源表和新表都叫"table1",并且都有2个字段,名字都是ID,field1,
不同的是源表的ID是integer,新表的ID是"自动增加".
begin
tqes:=todbcquery.create(self);
tqes.Database:=odbcsrc;
tqes.sql.add('SELECT * FROM table1 ORDER BY ID');
//取出源表数据,注意一定要按ID排序!
tqes.open;
tqed:=todbcquery.create(self);
tqed.Database:=odbcdest;
while not tqes.eofdo
begin
ids:=tqes.fieldbyname('id').asinteger;
idd:=-1;
while idd<>idsdo
begin
tqed.close;
tqed.sql.clear;
tqed.sql.add('delete * from table1 where id=:id');
tqed.ParamByName('id').asinteger:=idd;
tqed.ExecSQL;
tqed.close;
tqed.sql.clear;
tqed.sql.add('insert into table1 (field1) values(:fld)');
tqed.ParamByName('fld').asstring:=tqes.fieldbyname('field1').asstring;
tqed.ExecSQL;
tqed.close;
tqed.sql.clear;
tqed.sql.add('select max(id) as mx from table1');
tqed.Open;
idd:=tqed.fieldbyname('mx').asinteger;
end;
tqes.Next;
end;
tqes.free;
tqed.free;
showmessage('ok');
end;

注意:中间循环的那段代码很丑陋,没有做任何优化,你可以根据自己情况优化.
不过反正是自己用,慢点也无所谓. :-)
 
接受答案了.
 
后退
顶部