2013-04-25 37 views
-1

如何在存在現有數據時在SQL中重新標識SQL中的標識列?是否有一種簡單的方法來執行此操作,以便所有數據都可以獲得更新的身份(這些身份也反映在關聯外鍵上)?當IDENTITY列已用盡時該怎麼辦

編輯:如果達到您的身份列的限制會發生什麼?在這種情況下你會做什麼?那爲什麼我問這個問題。我只想了解這種問題如何解決。

+2

有什麼用途?如果是因爲你不喜歡差距或大數字,那麼*停止使用IDENTITY *。 – 2013-04-25 15:43:07

+0

這很混亂。所有表格中是否有唯一的約束(與IDENTITY無關)? – granadaCoder 2013-04-25 15:47:37

+0

但是,只是因爲「你可能會把它拉掉」..........並不意味着它是一個好主意。 – granadaCoder 2013-04-25 15:48:01

回答

0

沒有辦法自動做到這一點。你可以寫你自己的一套腳本來完成這件事,但我不知道任何商業(MS或其他)解決方案,「壓縮」現有的身份範圍。但是,正如亞倫所說的那樣,爲什麼你要這樣做呢?

SQL Server的身份值不保證沒有空白或甚至單調增長。更多詳情請查看http://sqlity.net/en/792/the-gap-in-the-identity-value-sequence/

如果你需要你的價值觀單調增長或持續增長,你可能需要開發自己的「價值提供者服務」。

-1

通過使用DBCC CHECKIDENT,可以提供RESEED參數和new_reseed_value如在下面的例子中(從MSDN鏈路):

USE AdventureWorks2012; 
GO 
DBCC CHECKIDENT ("Person.AddressType", RESEED, 10); 
GO 

結合與UPDATE和IDENTITY_INSERT修改現有數據。

+2

OP要求改變現有標識值的方法,而不是下一個。 – 2013-04-25 15:51:55

+0

您需要修改現有的和未來的身份以使其可以正常工作,特別是在您增加價值的情況下。 – Widor 2013-04-25 15:55:57

0

這是一個可能的HACK解決方案。

你是否從原始IDENTITY定義的「0」開始。

你有一個完整的-MAX到-1在你的處置。

DBCC CHECKIDENT ('MyTableName', RESEED, -2147483648); 

,但你可以有應用程序代碼:用於檢查之類的東西(如DOTNET的) 「如果的myKey> 0」,將bl0w起來。

如果你這樣做了,我會放一個額外的CHECK約束,一旦表命中-1就會失敗。

再一次,我沒有真正建議。但提供它作爲一種可能性。

有幾次我使用了IDENTITY(自「舊日」以來),我實際上是以-MAX值開始播種。

一個例子。一個沒有FK的日誌表。只需要一張表格來投擲一些每週都會被刷新的審計數據,所以這實際上並不重要。身份只是給了它一些命令。