表设计
自动编号的字段在删除记录后编号不连续
2005-02-04 16:39:02

问题:

  自动编号的字段在删除记录后编号不连续 比如原来有10条记录,删除其中第2条,序号2就变空号了 当表中某条记录被删除后,如何使后续的记录自动重新编号?

回答:

  关于自动编号和压缩数据库  你必须理解,自动编号(长整型)的目的不是为了使记录号连续,其用途有2个 1、标识记录的唯一性 2、标识记录的生成顺序 基于上述原因,你想使用自动编号字段来表示连续的记录号本身这个思路就是错误的。

 

如何表示连续的记录号有以下几个办法: 1、再建立一个专门用来存放记录号的字段,比如 RecordNo     添加记录时可以用 MAX(recordNO)+1 的方法。     当要删除某条记录时,比如这条记录的recordNo=6,我们用

    

delete from table where recordNo=6

 

    来做。这样就会产生空号,然后再用

    

update table set recordno=recordno-1 where recordno>6

 

    即可

 

2、在表中不存放记录号的数据,用sql查询自动生成

 

select [id],a,b,c,(select count(*) from table table2 where table2.[id]<=table1.[id]) as recordno from table table1 order by [id]

 

    其中 [id] 字段为自动编号字段

 

 

 

问题:  

  access2000中 有一自动编号的字段ID,ID 已有值分别为1,2,3,4,5,6,7,将6,7删除后,再压缩数据库,再新加记录,在不同的电脑上会出现不同的情况如下: 1,新ID 为6,7,8,9 2,新ID 为8,9

 

在ID为1,2,3,4,5,6,7的情况下,将4,5删除后,再压缩数据库,再新加记录,在不同的电脑上会出现不同的情况如下: 3,新ID为4,5,然后是6(出错,因为是主键不能重复) 4,新ID为8,9。。。 请问哪中情况是正常的,其他不正常的原因是什么。谢谢!!

 

 

回答:  

  你说的几种情况全部属于正常

 

1、自动编号是由 JET  引擎来设置的 2、自动编号 会自动被作为主键,而且有不重复索引 3、你可以不要将自动编号作为主键以及不要建立索引,将索引改为无 4、自动编号的起始值和步进值都是可以用程序等方法更改的,不是固定的 5、虽然你更改了起始值和步进值,但是如果新生成的值违反了“主键”或者“索引”的约束会产生错误 6、默认情况下,即使删除了记录,这条记录的自动编号也不会恢复。

以下是对情况的分析 1、你使用了比如压缩修复、UPDATE、ALTER TABLE 等方法更改了初始值 2、默认情况下就是这样 3、因为使用了压缩修复等方法,导致初始值重新从4开始,但是增加到6的时候,原来记录里面已经存在6这个编号了,违反了主键约束,所以产生错误 4、默认情况下就是这样。