我们知道,对于自增型字段,其字段值是不断递增的并且不能修改的.
假使清空有N条记录的一个表,然后再插入记录,那么新纪录的自增型
字段的值会从删除前最大的ID值开始,而不是从1开始.如果要做到从
1开始给自增型字段赋值,那么只有先删除该字段,然后新建该字段.代码如下,但测试时自增型字段并没有从1开始,而是仍旧从上次最大的
ID开始.Why?
procedure RefreshKeyField(); procedure DeleteKeyFieldIndexesAndKeys(); //删除主键上的所有索引和所有键
var
i3: integer;
begin
i3:= 0;
while i3 < NewDB.Tables[ATableName].Indexes.Count do
begin
if NewDB.Tables[ATableName].Indexes[i3].Columns[0].Name = KeyField then
NewDB.Tables[ATableName].Indexes.Delete(NewDB.Tables[ATableName].Indexes[i3].Name) //删除一个索引则Count减1,故不须改变i3;
else
Inc(i3);
end; i3:= 0;
while i3 < NewDB.Tables[ATableName].Keys.Count do
begin
if NewDB.Tables[ATableName].Keys[i3].Columns[0].Name = KeyField then
NewDB.Tables[ATableName].Keys.Delete(NewDB.Tables[ATableName].Keys[i3].Name)
else
Inc(i3);
end;
end; procedure DeleteKeyField();
var
tmpqry: tadoquery;
begin
tmpqry:= tadoquery.Create(nil);
tmpqry.ConnectionString:= Format(connstr, [fmmain.edOldDB.Text, WorkGroupFilePath]);
tmpqry.SQL.Text:= Format(' ALTER TABLE %s Drop %s CASCADE ', [ATableName, KeyField]);
tmpqry.ExecSQL; tmpqry.Close;
tmpqry.Free;
end; procedure AddKeyField();
var
tmpqry: tadoquery;
begin
tmpqry:= tadoquery.Create(nil);
tmpqry.ConnectionString:= Format(connstr, [fmmain.edOldDB.Text, WorkGroupFilePath]);
tmpqry.SQL.Text:= Format(' ALTER TABLE %s ADD %s COUNTER(1,1) PRIMARY KEY ', [ATableName, KeyField]);
tmpqry.ExecSQL; tmpqry.Close;
tmpqry.Free;
end;begin
DeleteKeyFieldIndexesAndKeys(); //必须先删除主键上的所有索引和所有键
DeleteKeyField();
AddKeyField();
end;
注:
NewDB是一个_Catalog变量.
假使清空有N条记录的一个表,然后再插入记录,那么新纪录的自增型
字段的值会从删除前最大的ID值开始,而不是从1开始.如果要做到从
1开始给自增型字段赋值,那么只有先删除该字段,然后新建该字段.代码如下,但测试时自增型字段并没有从1开始,而是仍旧从上次最大的
ID开始.Why?
procedure RefreshKeyField(); procedure DeleteKeyFieldIndexesAndKeys(); //删除主键上的所有索引和所有键
var
i3: integer;
begin
i3:= 0;
while i3 < NewDB.Tables[ATableName].Indexes.Count do
begin
if NewDB.Tables[ATableName].Indexes[i3].Columns[0].Name = KeyField then
NewDB.Tables[ATableName].Indexes.Delete(NewDB.Tables[ATableName].Indexes[i3].Name) //删除一个索引则Count减1,故不须改变i3;
else
Inc(i3);
end; i3:= 0;
while i3 < NewDB.Tables[ATableName].Keys.Count do
begin
if NewDB.Tables[ATableName].Keys[i3].Columns[0].Name = KeyField then
NewDB.Tables[ATableName].Keys.Delete(NewDB.Tables[ATableName].Keys[i3].Name)
else
Inc(i3);
end;
end; procedure DeleteKeyField();
var
tmpqry: tadoquery;
begin
tmpqry:= tadoquery.Create(nil);
tmpqry.ConnectionString:= Format(connstr, [fmmain.edOldDB.Text, WorkGroupFilePath]);
tmpqry.SQL.Text:= Format(' ALTER TABLE %s Drop %s CASCADE ', [ATableName, KeyField]);
tmpqry.ExecSQL; tmpqry.Close;
tmpqry.Free;
end; procedure AddKeyField();
var
tmpqry: tadoquery;
begin
tmpqry:= tadoquery.Create(nil);
tmpqry.ConnectionString:= Format(connstr, [fmmain.edOldDB.Text, WorkGroupFilePath]);
tmpqry.SQL.Text:= Format(' ALTER TABLE %s ADD %s COUNTER(1,1) PRIMARY KEY ', [ATableName, KeyField]);
tmpqry.ExecSQL; tmpqry.Close;
tmpqry.Free;
end;begin
DeleteKeyFieldIndexesAndKeys(); //必须先删除主键上的所有索引和所有键
DeleteKeyField();
AddKeyField();
end;
注:
NewDB是一个_Catalog变量.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货