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

我假设我可以运行一个查询,用增量数字填充这个列,然后设置为主键并打开自动增量。这是正确的做法吗?如果是,我怎么填入初始数字?


当前回答

如果这个列在你的表中已经存在,并且它是空的,你可以用这个命令更新这个列(替换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

其他回答

创建一个具有不同名称和相同列、主键和外键关联的新表,并将其链接到代码的Insert语句中。 对于EMPLOYEE,替换为EMPLOYEES。

CREATE TABLE EMPLOYEES(

    EmpId        INT NOT NULL IDENTITY(1,1), 
    F_Name       VARCHAR(20) ,
    L_Name       VARCHAR(20) ,
    DOB          DATE ,
    DOJ          DATE ,
    PRIMARY KEY (EmpId),
    DeptId int FOREIGN KEY REFERENCES DEPARTMENT(DeptId),
    DesgId int FOREIGN KEY REFERENCES DESIGNATION(DesgId),
    AddId int FOREIGN KEY REFERENCES ADDRESS(AddId)   
) 

但是,您必须删除现有的EMPLOYEE表,或者根据您的需求进行一些调整。

您不能“打开”IDENTITY:这是一个表重建。

如果您不关心数字顺序,您可以用IDENTITY一次性添加列NOT NULL。15万行不是很多。

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

我遇到了这个问题,但不能使用标识列(由于各种原因)。 我决定这样做:

DECLARE @id INT
SET @id = 0 
UPDATE table SET @id = id = @id + 1 

从这里借的。

这里有一个你可以尝试的主意。 原始表-没有标识列table1 创建一个新的表-调用表2和标识列。 将数据从table1复制到table2 -标识列自动填充自动递增的数字。

将原表table1重命名为table3 将新表- table2重命名为table1(原始表) 现在已经有了包含标识列的表1,并为现有数据填充了标识列。 在确保没有问题并且工作正常后,在不再需要时删除表3。

如果这个列在你的表中已经存在,并且它是空的,你可以用这个命令更新这个列(替换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