2011-04-27 42 views
1

請幫幫我!我有一個表將一個標識字段的值是,例如, ,例如,1,2,4,6,8,10,11 ....等重新排列sql server中的標識列值

我想使它在一個序列,即,1,2,3,4,5,6,7 ...不使用降

謝謝

+1

除了下面的答案之外,除了唯一標識一條記錄外,這個標識字段應該沒有附加的含義。它不應該是一個發票號碼或包裝號碼或任何其他類型的數字,意味着某人某事。 – Leslie 2011-04-27 14:22:59

+0

你爲什麼要這麼做? – 2011-04-27 14:30:09

回答

3

你不能。 identity列不可更新。 (或至少你不能以任何理智的方式,你可以刪除表中的所有行,然後將它們重新插入IDENTITY_INSERT上)

identity列中的差距也只是一個事實,最好能達到有!如果您需要連續的數字序列用於顯示,您可以使用ROW_NUMBER

+1

身份將alawys有差距,他們花費的每個記錄,回滾以及以後刪除的記錄。 – HLGEM 2011-04-27 15:29:48

1

爲什麼不創建一個新的字段,使它從1開始的idenity種子,然後刪除舊列並重命名新列(然後重新創建所有FK引用)。

+0

SQL Server不允許更改列上的標識屬性。您需要刪除整個原始列並創建一個新的標識列。沒有特別的保證,新的順序與舊的順序相對應。 – 2011-04-27 14:39:54

+0

@Martin - 不正確。通過SQL Server 2005/2008管理器中的用戶界面,您可以更改列刪除列的自動編號(標識)屬性(通過右鍵單擊並選擇「設計」)來選擇表。 – 2011-04-27 16:50:14

+0

這實際上是在幕後重建整個桌子。單擊工具欄中的「腳本」圖標查看它生成的SQL。 – 2011-04-27 16:51:13

1

有沒有簡單的方法來做到這一點,並沒有理由爲什麼你應該。然而,你可以contruct期爲用戶提供類似的功能:

CREATE VIEW MyTableView AS SELECT ROW_NUMBER() OVER (ORDER BY Identity) AS RowNum, * FROM MyTable 

,然後讓客戶從MyTableView選擇來代替。

如果您需要視圖與表格名稱相同,以確保向後兼容,您當然可以重命名您的表格,然後使用舊的表格名稱創建視圖。

+0

哎呦,完全錯誤的問題,現在應該修復答案。 – 2011-04-27 14:35:20

0

DBCC CHECKIDENT(< '表名'>,RESEED,< '表最後一個序列**'>)

**這將使數加1(+1)進入時。即需要下一個爲38的新紀錄,所以用37作爲這個值。

1

我認爲這是最好的解決辦法..嘗試,如果你喜歡它...

DECLARE @INC AS INTEGER 
SET @INC = 1 
WHILE (@INC <= 7582) --7582 is rowcount of table 
BEGIN 
    UPDATE YourTable 
    SET ID = @INC 
    WHERE ID = (
       SELECT MIN(ID) AS T 
       FROM YourTable 
       WHERE ID > @INC 
      ) --ID=> Identity column 
    SET @INC = @INC + 1 
END 

注:執行,你需要刪除的標識插入到列前。