我在標識主鍵上使用標識。 然後我插入一些數據。例如, 。標識SQL Server問題
數據1 - >添加成功,沒有錯誤。 ID 1
數據2 - >添加成功,沒有錯誤。 ID 2
數據3 - >添加失敗,錯誤。
數據4 - >添加失敗,錯誤。
數據5 - >添加成功,沒有錯誤。 ID 5
你可以看到,ID爲2〜5
爲什麼跳?如何解決這個問題?
我在標識主鍵上使用標識。 然後我插入一些數據。例如, 。標識SQL Server問題
數據1 - >添加成功,沒有錯誤。 ID 1
數據2 - >添加成功,沒有錯誤。 ID 2
數據3 - >添加失敗,錯誤。
數據4 - >添加失敗,錯誤。
數據5 - >添加成功,沒有錯誤。 ID 5
你可以看到,ID爲2〜5
爲什麼跳?如何解決這個問題?
這是有意設計的,sql server首先遞增計數器並且嘗試創建行,如果它失敗事務(總是隱式事務)被回滾但自動遞增值不被重用。這是通過設計,我會很驚訝地發現它可以避免(最終你可以調用一些命令並將該值重置爲當前最大值)。您始終可以使用觸發器來生成此值,但這會產生性能影響,通常您不應該在乎auto_increment的值,它只是一個整數,如果您的應用程序稍後出現相同的情況,您可能會遇到同樣的情況。
這是一個問題?
通常,您將在主鍵列中使用標識。然後,這個主鍵是代理鍵,這意味着這絕對沒有商業價值/商業意義。 這只是一個'管理'的事實,這是數據庫可以唯一標識一條記錄所必需的。 所以,這個值是什麼並不重要;也有差距並不重要。你爲什麼希望他們連續。
而且,假設它們是連續的 - 當插入失敗時不會出現間隙 - 當您刪除一行並稍後插入一行時,您會做什麼?你是否也填補了空白?
如果插入失敗,您可以使用設置identity_insert mytable,並使用max(myfield)+1手動計算下一個身份。儘管如此,您可能會遇到併發問題。
但這是一個混亂。差距沒有問題。
@Frederik回答了大部分內容 - 我只是補充說,您正在混合主鍵和業務鍵。發票(或其他)應由發票編號標識 - 一個商業密鑰,該表中應有一個UNIQUE列。主鍵在這裏標識表中的一行,並且應該由數據庫(加入..)和DBA使用。
向業務用戶公開主鍵最終會遇到麻煩,數據庫遲早會失去參照完整性 - 總是這樣,人們很有創意。
當會計師看到身份證號碼的差距時,他們會覺得奇怪:)他們認爲有記錄存在,但被某種方式惡意抹去。 – 2010-01-07 22:27:06
會計師不應該看到該ID,因爲它只是在數據庫中使用的內容,並且沒有商業意義。 並且不要告訴我會計師可以直接訪問數據庫。 :) – 2010-01-07 22:28:29
如果它是一個交易ID,他們確實看到它。與普通用戶人羣不同,會計人員非常關心他們的東西的唯一數字標識。 – 2010-01-07 22:30:38