2016-11-24 74 views
1

我有這個表alter table來基於訂購添加標識列通過

------------------------------------ 
| **Id** |**Name** | **Created** | 
------------------------------------ 
| Guid1 | John Doe | 2016-01-01 | 
------------------------------------ 
| Guid2 | Mary Jane| 2015-01-01 | 
------------------------------------ 

列標識是PK和一個聚集索引,所以我要添加標識列:

ALTER TABLE [Person] 
ADD 
IdentityCol INT IDENTITY(1,1) NOT NULL 

的問題是,每當我試圖這樣做的時候,它增加了IDENTITYCOL的價值,基於表的默認順序,我想是d上由列ID

------------------------------------------------- 
| **Id** |**Name** | **Created** | IdentityCol| 
------------------------------------------------- 
| Guid1 | John Doe | 2016-01-01 | 1  | 
------------------------------------------------- 
| Guid2 | Mary Jane| 2015-01-01 | 2  | 
------------------------------------------------- 

購買efined我要的是通過創建列

------------------------------------------------- 
| **Id** |**Name** | **Created** | IdentityCol| 
------------------------------------------------- 
| Guid1 | John Doe | 2016-01-01 | 2  | 
------------------------------------------------- 
| Guid2 | Mary Jane| 2015-01-01 | 1  | 
------------------------------------------------- 

創造價值次序是有什麼辦法可以指定順序通過ALTER句子?

回答

4

使用行號:

SET IDENTITY_INSERT database.schema.Person ON 
+1

也許使用'SET IDENTITY_INSERT database.schema.Person ON'?並在作業完成後將其設置爲「OFF」。 –

2

你必須創建具有相同的結構+標識列的新表:

UPDATE Person p 
SET IdentityCol = (SELECT ROW_NUMBER() over (ORDER BY Created) AS rn 
        FROM Person t WHERE p.Id = t.Id) 

然後,你可以通過設置IdentityCol作爲一個正式的身份列。在訂購時插入舊數據

Insert into ... 
Select ... 
Order by ... 

否則,您必須考慮添加列(而不是標識)。按照你想要的順序填寫自動編號,就像@Tim回答。然後將其設置爲身份

0

不能更新IDENTITY cloumn,您刪除和插入

select Id,Name,Created into #temptable from [Person] 
TRUNCATE TABLE [Person] 
ALTER TABLE [Person] ADD [IdentityCol] INT IDENTITY(1,1) NOT NULL 

INSERT INTO [Person](Id,Name,Created) 
select Id,Name,Created from #temptable order by Created 
0

我不知道這是否是解決我的問題的正確途徑,但我是這樣結束:

首先,我刪除由SQL爲PK創建的索引(列ID)。

ALTER TABLE [Person] DROP CONSTRAINT PK__PersonId 

只有當您沒有任何與列ID相關的表並且同時刪除人員表的PK時,這才起作用。

其次,我創建創建列時間聚集索引:

CREATE CLUSTERED INDEX IX_CreatedTemp ON [Person] (Created ASC) 

現在SQL排序基於創建列的表,所以現在我可以加我的標識列。

ALTER TABLE [Person] 
    ADD IdentityCol INT UNIQUE IDENTITY(1,1) NOT NULL 

當加入柱中,SQL自動填寫基於默認順序,這是由索引IX_CreatedTemp確定上的值。

所以結果是如我所料

** **人

------------------------------------------------- 
| **Id** |**Name** | **Created** | IdentityCol| 
------------------------------------------------- 
| Guid1 | John Doe | 2016-01-01 | 2  | 
------------------------------------------------- 
| Guid2 | Mary Jane| 2015-01-01 | 1  | 
------------------------------------------------- 

現在是時候返回列ID作爲PK。首先,我刪除我的臨時指數:

DROP INDEX IX_CreatedTemp ON [Person] 

現在加入PK:

ALTER TABLE [Person] 
    ADD CONSTRAINT PK_Person PRIMARY KEY NONCLUSTERED (Id) 

最後,我說根據我的新IDENTITYCOL的新指標,使我的錶快

CREATE UNIQUE CLUSTERED INDEX IX_IdentityCol ON [Person] (IdentityCol ASC) 

一切工作正常。

+0

表沒有順序。實施有秩序,但從表中選擇並不保證重新選擇該訂單。所以這隻*看起來*工作。在TimBiegeleisen的回答中,通過窗口函數,您可以選擇一個按列排序保存row_number的新列。 – philipxy