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

时间:2011-02-01 12:11:45

标签: sql-server sql-server-2008 primary-key alter-table

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

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

15 个答案:

答案 0 :(得分:380)

不 - 你必须反过来这样做:从get get开始直接添加INT IDENTITY - 当你这样做时,它将被填充身份值:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY

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

ALTER TABLE dbo.YourTable
   ADD CONSTRAINT PK_YourTable
   PRIMARY KEY(ID)

或者如果您希望一步完成所有操作:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY
       CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED

答案 1 :(得分:18)

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

如果你不关心数字顺序,你可以一次性添加IDENTITY列,NOT NULL。 150k行不是很多。

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

答案 2 :(得分:11)

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

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

借鉴here

答案 3 :(得分:4)

如果列中已存在该列且为null,则可以使用此命令更新列(替换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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

设计师可以设置身份(1,1) 右键单击tbl =&gt;设计=&gt;部分左(右键单击)=&gt; properties =&gt;在标识列中选择#column

Properties

idendtity column

答案 6 :(得分:2)

如果您的表使用其主键或foriegen键与其他表有关系,则可能无法更改您的表。所以你需要再次放下并创建表格 要解决这些问题,您需要通过右键单击数据库生成脚本,并在高级选项集数据类型中编写脚本到方案和数据。之后,使用此脚本更改列以使用运行查询来识别和重新生成表 您的查询将如下:

USE [Db_YourDbName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Drop TABLE [dbo].[Tbl_TourTable]

CREATE TABLE [dbo].[Tbl_TourTable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Family] [nvarchar](150) NULL)  

GO

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] ON 

INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] off 

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

创建一个具有不同名称和相同列,主键和外键关联的新表,并在您的Insert语句中链接它。 例如:对于员工,请替换为员工。

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表或根据您的要求进行一些调整。

答案 9 :(得分:0)

这个答案是对最高投票答案的一个小补充,适用于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

答案 10 :(得分:0)

变更表/ **粘贴表格名称** / 添加id int IDENTITY(1,1)

从/ **中删除,粘贴表格名称** /

中的ID

选择a.id FROM / **粘贴表格名称 /作为 左外连接(         SELECT MIN(id)作为ID         FROM / 粘贴制表符的名称 /         通过...分组  / 粘贴列c1,c2 .... ** /

) as t1 
ON a.id = t1.id

t1.id为NULL

变更表/ **粘贴表格名称** / 删除列ID

答案 11 :(得分:0)

No module named pkg_resources error

答案 12 :(得分:-3)

尝试这样的事情(首先在测试台上):

USE your_database_name
GO
WHILE (SELECT COUNT(*) FROM your_table WHERE your_id_field IS NULL) > 0
BEGIN
    SET ROWCOUNT 1
    UPDATE your_table SET your_id_field = MAX(your_id_field)+1
END
PRINT 'ALL DONE'

我根本没有测试过这个,所以要小心!

答案 13 :(得分:-3)

这适用于MariaDB,所以我只能希望它在SQL Server中运行:删除您刚刚插入的ID列,然后使用以下语法: -

ALTER TABLE table_name ADD id INT PRIMARY KEY AUTO_INCREMENT;

不需要另一张桌子。这只是插入一个id列,使其成为主索引,并使用顺序值填充它。如果SQL Server不这样做,我很抱歉浪费你的时间。

答案 14 :(得分:-3)

ALTER TABLE table_name ADD COLUMN ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT; 这可能很有用