我有一個新的集羣數據庫,我一直在將數據移入舊數據庫的表中。當我導入數據時,一切工作正常,但是當我手動插入記錄時,「標識」列不會跟隨下一個標識號碼。因此,例如,我將100條記錄導入表中,並且Identity列顯示1-100,但是如果我手動向數據庫添加一行,則會得到102或103,而不是101.SQL標識列增加2或3
任何創意爲什麼發生這種情況?
它會在所有我的表的發生,它變得非常沮喪,有時身份之間的差距達到4或5
我有一個新的集羣數據庫,我一直在將數據移入舊數據庫的表中。當我導入數據時,一切工作正常,但是當我手動插入記錄時,「標識」列不會跟隨下一個標識號碼。因此,例如,我將100條記錄導入表中,並且Identity列顯示1-100,但是如果我手動向數據庫添加一行,則會得到102或103,而不是101.SQL標識列增加2或3
任何創意爲什麼發生這種情況?
它會在所有我的表的發生,它變得非常沮喪,有時身份之間的差距達到4或5
如果「測試」你的事務並回滾中插入。然後你真正運行它。事務中的插入操作會將身份字段加1,即使您之後回滾也是如此。
您不應該依賴任何特定模式(例如,總是隻增加1)的標識列。唯一的保證是當前表中的值將是唯一的。
國際海事組織,人們不應該關注身份專欄中的差距。這種代理鍵(而不是自然鍵)的全部意義在於不必擔心任何「正確性」。
現在,就像羅賓說的那樣,您可能會有報表回滾或者錯誤輸出,從而導致身份上的差距。
可導致差距的另一件事是身份本身的定義。運行此聲明,明白我的意思
Declare @MyTable table (MyColumn1 Int Identity (1, 5))
INSERT INTO @MyTable Default Values
INSERT INTO @MyTable Default Values
INSERT INTO @MyTable Default Values
INSERT INTO @MyTable Default Values
INSERT INTO @MyTable Default Values
INSERT INTO @MyTable Default Values
SELECT * FROM @MyTable
你可以不依賴於標識列始終是連續的,因爲增量由SQL Server維護和整個交易將被保留。雖然在更改表結構或將SET IDENTITY_INSERT切換爲ON並恢復爲OFF時重置此增量,但我不會建議它。
如果您確實依賴順序ID,則應創建一個非標識列並編寫自己的邏輯以確保其保持順序。
如果通過SSMS添加行並嘗試插入行並遇到任何類型的約束違例(即數據類型違例或外鍵違例),則即使該行未成功插入,身份也會增加1進入桌子。這可能是發生了什麼?
不幸的是,我沒有爲此使用SSIS。 – 2010-06-16 07:51:13
感謝您的信息,但我沒有在事務中運行,因爲數據庫當前正在「脫機」(可以這麼說),而我正在導入數據。我可以創建一個新表,並且標識列中將包含一個不同的數字,當您期望它爲1. – 2010-03-22 14:38:07