自動(dòng)編號(hào)的字段在刪除記錄后編號(hào)不連續(xù)

字號(hào):

問題:
    自動(dòng)編號(hào)的字段在刪除記錄后編號(hào)不連續(xù)
    比如原來有10條記錄,刪除其中第2條,序號(hào)2就變空號(hào)了
    當(dāng)表中某條記錄被刪除后,如何使后續(xù)的記錄自動(dòng)重新編號(hào)?
    回答:
    關(guān)于自動(dòng)編號(hào)和壓縮數(shù)據(jù)庫(kù)
    你必須理解,自動(dòng)編號(hào)(長(zhǎng)整型)的目的不是為了使記錄號(hào)連續(xù),其用途有2個(gè)
    1、標(biāo)識(shí)記錄的性
    2、標(biāo)識(shí)記錄的生成順序
    基于上述原因,你想使用自動(dòng)編號(hào)字段來表示連續(xù)的記錄號(hào)本身這個(gè)思路就是錯(cuò)誤的。
    如何表示連續(xù)的記錄號(hào)有以下幾個(gè)辦法:
    1、再建立一個(gè)專門用來存放記錄號(hào)的字段,比如 RecordNo
    添加記錄時(shí)可以用 MAX(recordNO)+1 的方法。
    當(dāng)要?jiǎng)h除某條記錄時(shí),比如這條記錄的recordNo=6,我們用
    delete from table where recordNo=6
    來做。這樣就會(huì)產(chǎn)生空號(hào),然后再用
    update table set recordno=recordno-1 where recordno>6
    即可
    2、在表中不存放記錄號(hào)的數(shù)據(jù),用sql查詢自動(dòng)生成
    select [id],a,b,c,(select count(*) from table table2 where table2.[id]<=table1.[id]) as recordno from table table1 order by [id]
    其中 [id] 字段為自動(dòng)編號(hào)字段
    問題:
    access2000中 有一自動(dòng)編號(hào)的字段ID,ID 已有值分別為1,2,3,4,5,6,7,將6,7刪除后,再壓縮數(shù)據(jù)庫(kù),再新加記錄,在不同的電腦上會(huì)出現(xiàn)不同的情況如下:
    1,新ID 為6,7,8,9
    2,新ID 為8,9
    在ID為1,2,3,4,5,6,7的情況下,將4,5刪除后,再壓縮數(shù)據(jù)庫(kù),再新加記錄,在不同的電腦上會(huì)出現(xiàn)不同的情況如下:
    3,新ID為4,5,然后是6(出錯(cuò),因?yàn)槭侵麈I不能重復(fù))
    4,新ID為8,9。。。
    請(qǐng)問哪中情況是正常的,其他不正常的原因是什么。謝謝?。?BR>    回答:
    你說的幾種情況全部屬于正常
    1、自動(dòng)編號(hào)是由 JET 引擎來設(shè)置的
    2、自動(dòng)編號(hào) 會(huì)自動(dòng)被作為主鍵,而且有不重復(fù)索引
    3、你可以不要將自動(dòng)編號(hào)作為主鍵以及不要建立索引,將索引改為無
    4、自動(dòng)編號(hào)的起始值和步進(jìn)值都是可以用程序等方法更改的,不是固定的
    5、雖然你更改了起始值和步進(jìn)值,但是如果新生成的值違反了“主鍵”或者“索引”的約束會(huì)產(chǎn)生錯(cuò)誤
    6、默認(rèn)情況下,即使刪除了記錄,這條記錄的自動(dòng)編號(hào)也不會(huì)恢復(fù)。
    以下是對(duì)情況的分析
    1、你使用了比如壓縮修復(fù)、UPDATE、ALTER TABLE 等方法更改了初始值
    2、默認(rèn)情況下就是這樣
    3、因?yàn)槭褂昧藟嚎s修復(fù)等方法,導(dǎo)致初始值重新從4開始,但是增加到6的時(shí)候,原來記錄里面已經(jīng)存在6這個(gè)編號(hào)了,違反了主鍵約束,所以產(chǎn)生錯(cuò)誤
    4、默認(rèn)情況下就是這樣。