2015-09-02 41 views
1

我有一個表格填充數據,其中一列 - TrackingNumber - 是一個整數值。我收到了一個請求,將其更改爲自動增量,並讓它在1000000處啓動標識種子。我知道我無法將列更改爲現有數據表中的標識列,因此我有兩種選擇:創建一個全新的表,然後將舊錶中的數據移動到該新表中,或者添加新的標識列並使用舊列中的數據更新它。更新SQL Server中的標識列並設置種子起始值

問題是我需要保留列TrackingNumber中的所有現有值。我曾嘗試以下:

1) ALTER TABLE [dbo].[Table1] 
ADD [TrackingNumber2] [bigint] IDENTITY (1000000, 1) NOT NULL 

2) UPDATE [dbo].[Table1] 
SET [TrackingNumber2]=[TrackingNumber] 

3) ALTER TABLE [dbo].[Table1] 
DROP COLUMN [TrackingNumber] 
GO 

4) EXEC sp_rename 'Table1.TrackingNumber2', 'TrackingNumber','COLUMN' 

我得到了第2步的錯誤 - 從舊列中的值更新新的欄目:「無法更新標識列‘TrackingNumber2’」

誰能推薦一個解決方法?

回答

0

我結束了創建一個新表,並在那裏

0

肯定你需要使用標識列?有替代品。例如,由於SQL Server 2012(以及天藍色)也有稱爲序列的東西。您可以定義一個序列中的任何號碼,即可開始你喜歡:

create sequence dbo.TrackingSequence 
as int 
    start with 1000000 
    increment by 1 
    no maxvalue 
    no cycle 
    no cache 

然後,您可以更改表,使得問題列的默認值默認從序列:

alter table dbo.MyTable 
    add constraint [MyTable.TrackingNumber.Default.TrackingSequence] 
    default(next value for dbo.TrackingSequence) for TrackingNumber 

(如果列已經有一個默認值,您需要首先刪除它 - 在一個單獨的語句中。)

一個序列的工作方式與身份類似,但您不必中斷現有值或列definit離子本身。

唯一的技巧是記住不要指定TrackingNumber的值,並讓數據庫完成它的工作。

序列是很酷,你可以有一個被多個表的一個序列,給你比過去方案稍短分貝範圍內唯一的ID。對於這樣的應用程序,你可能會用bigint專欄更好 - 或者知道所討論的表格不會太長。

+0

我在使用甲骨文的序列,但沒有在SQL Server意識到它們的存在。謝謝! – ElenaDBA

+0

在添加序列之前,表中已有的該列的現有值會發生什麼 – ElenaDBA

+0

不是。這是最好的部分。如果您的外鍵引用了您的TrackingNumber列,則它們仍然很好。我假設1000000是讓你通過所有現有的價值。 – Clay