SQL Server将自动增量主键添加到现有表

fea*_*net 231 sql-server alter-table primary-key sql-server-2008

作为标题,我有一个已经填充150000条记录的现有表.我添加了一个Id列(当前为null).

我假设我可以运行查询以使用增量数填充此列,然后设置为主键并启用自动增量.这是正确的方法吗?如果是这样,我如何填写初始数字?

mar*_*c_s 397

不 - 你必须以相反的方式做到这一点:从一开始就添加它INT IDENTITY- 当你这样做时它将被填充身份值:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY
Run Code Online (Sandbox Code Playgroud)

然后你可以把它作为主键:

ALTER TABLE dbo.YourTable
   ADD CONSTRAINT PK_YourTable
   PRIMARY KEY(ID)
Run Code Online (Sandbox Code Playgroud)

或者如果你喜欢一步到位:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY
       CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED
Run Code Online (Sandbox Code Playgroud)

  • 我只是使用了它,它似乎工作了`alter table attachments add ATTACHMENT_NUMBER int identity(1000,1)` (3认同)
  • 这是一个非常好的答案,但是如何将起始整数从1更改为1000?我想开始计数1000.我怀疑我可以使用`ALTER TABLE ORDER ALTER COLUMN ORDERNO RESTART WITH 1`但是我不想在没有专家的情况下尝试它:)参考.http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Fsqlp%2Frbafysqlpidentity.htm (2认同)
  • @ turbo88:定义“ PRIMARY KEY”时,会自动为您创建聚簇索引(除非您明确指定“ NONCLUSTERED”) (2认同)

gbn*_*gbn 19

你不能"打开"IDENTITY:它是一个表重建.

如果您不关心数字顺序,则可以一次性添加带有IDENTITY的列NOT NULL.150k行不是很多.

如果您需要保留一些数字顺序,请相应地添加数字.然后使用SSMS表设计器设置IDENTITY属性.这允许您生成一个脚本,该脚本将为您执行列删除/添加/保留数字/重新设置.

  • OP在SQL Server 2008上[所以有一种方法](http://stackoverflow.com/questions/6084572/how-to-set-auto-increment-after-creating-a-table-without-any-data -Loss/6086661#6086661) (5认同)

Kev*_*vin 11

我有这个问题,但无法使用标识列(出于各种原因).我解决了这个问题:

DECLARE @id INT
SET @id = 0 
UPDATE table SET @id = id = @id + 1 
Run Code Online (Sandbox Code Playgroud)

借来自这里.


小智 7

ALTER TABLE table_name ADD temp_col INT IDENTITY(1,1) 
update 
Run Code Online (Sandbox Code Playgroud)

  • 你能解释一下吗? (6认同)

小智 6

当我们在现有表中添加标识列时,它将自动填充,无需手动填充。


Joh*_* K. 6

此答案是对最高投票答案的一个小补充,适用于 SQL Server。问题要求自动增量主键,当前答案确实添加了主键,但没有标记为自动增量。下面的脚本检查列是否存在,并在启用自动增量标志的情况下添加它。

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTable' AND COLUMN_NAME = 'PKColumnName')
BEGIN


ALTER TABLE dbo.YourTable
   ADD PKColumnName INT IDENTITY(1,1)

CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED

END

GO
Run Code Online (Sandbox Code Playgroud)


Ren*_*iot 5

如果该列已存在于您的表中并且为空,您可以使用以下命令更新该列(替换 id、tablename 和 tablekey):

UPDATE x
SET x.<Id> = x.New_Id
FROM (
  SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
  FROM <tablename>
  ) x
Run Code Online (Sandbox Code Playgroud)