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

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

我假设我可以运行一个查询来填充此列增量数字,然后设置为主键,并打开自动增量。 这是继续进行的正确方法吗? 如果是这样,我该如何填写最初的数字?

否 – 你必须以相反的方式来做:把它作为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 

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

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

如果您需要保留一些号码顺序,则相应地添加号码。 然后使用SSMS表devise器来设置IDENTITY属性。 这可以让你生成一个脚本,将做列删除/添加/保持数字/种子为你。

我有这个问题,但不能使用身份列(由于各种原因)。 我解决了这个问题:

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

从这里借来的。

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

如果该列已经存在于您的表中并且为空,则可以使用此命令更新列(replaceid,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 

由devise师可以设置身份(1,1)右键单击tbl => desing =>左部分(右键)=>属性=>在身份列中select#column

属性

idendtity专栏

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

重命名原始表 – table1到table3重新命名新的表 – table2到table1(原始表)现在你有table1与标识列包括和填充现有的数据。 在确定没有问题并且正常工作之后,在不再需要的时候丢弃table3。

创build一个具有不同名称和相同列,主键和外键关联的新表,并将其链接到Insert语句的代码中。 例如:对于EMPLOYEE,请用EMPLOYEESreplace。

 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) ) 

但是,您必须删除现有的员工表或根据您的要求做一些调整。

如果你的表与其他表使用主键或foriegen键有关系,可能是不可能改变你的表。 所以你需要删除并重新创build表。
要解决这些问题,您需要通过右键单击数据库和高级选项设置数据types来生成脚本,以便脚本化scheme和数据。 在此之后,使用此脚本与更改您的列来识别和重新生成表使用运行其查询。
你的查询将如下所示:

 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 

这在MariaDB中有效,所以我只能希望它在SQL Server中有效:删除刚刚插入的ID列,然后使用以下语法:

ALTER TABLE table_name ADD id INT PRIMARY KEY AUTO_INCREMENT;

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

尝试像这样(首先在testing桌上):

使用your_database_name
走
 WHILE(SELECT COUNT(*)FROM your_table WHERE your_id_field IS NULL)> 0
开始
     SET ROWCOUNT 1
    更新your_table SET your_id_field = MAX(your_id_field)+1
结束
打印“全部完成”

我没有testing过,所以要小心!