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?
使用行号:
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)
您必须创建一个具有相同结构+标识列的新表。按顺序将旧数据插入其中
Insert into ...
Select ...
Order by ...
Run Code Online (Sandbox Code Playgroud)
否则你必须考虑添加一列(而不是身份)。按照您想要的顺序填写自动编号,如 @Tim 答案。然后将其设置为身份