更改表以基于Order By添加Identity列

ant*_*_mg 2 sql t-sql sql-server

我有这张桌子

------------------------------------
| **Id**  |**Name**  | **Created** | 
------------------------------------
| Guid1   | John Doe |  2016-01-01 |
------------------------------------
| Guid2   | Mary Jane|  2015-01-01 |
------------------------------------
Run Code Online (Sandbox Code Playgroud)

列Id是PK和聚簇索引,所以我想添加一个标识列:

ALTER TABLE [Person]
ADD
IdentityCol INT IDENTITY(1,1) NOT NULL
Run Code Online (Sandbox Code Playgroud)

问题是,每当我尝试这样做时,它会根据表的默认顺序添加IdentityCol的值,我认为这是由列Id定义的

-------------------------------------------------
| **Id**  |**Name**  | **Created** | IdentityCol|
-------------------------------------------------
| Guid1   | John Doe |  2016-01-01 |    1       |
-------------------------------------------------
| Guid2   | Mary Jane|  2015-01-01 |    2       |
-------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

买我想要的是按创建列创建值顺序

-------------------------------------------------
| **Id**  |**Name**  | **Created** | IdentityCol|
-------------------------------------------------
| Guid1   | John Doe |  2016-01-01 |    2       |
-------------------------------------------------
| Guid2   | Mary Jane|  2015-01-01 |    1       |
-------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

有没有办法在ALTER句子中指定Order By?

Tim*_*sen 5

使用行号:

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

然后您可以IdentityCol通过以下方式将其设置为正式标识列:

SET IDENTITY_INSERT database.schema.Person ON
Run Code Online (Sandbox Code Playgroud)


Had*_*adi 5

您必须创建一个具有相同结构+标识列的新表。按顺序将旧数据插入其中

Insert into ...
Select ...
Order by ...
Run Code Online (Sandbox Code Playgroud)

否则你必须考虑添加一列(而不是身份)。按照您想要的顺序填写自动编号,如 @Tim 答案。然后将其设置为身份