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

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

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

681339 次浏览

不-你必须反过来做:从一开始就将它添加为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:这是一个表重建。

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

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

试着这样做(先在测试台上):

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'

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

我有这个问题,但不能使用标识列(由于各种原因)。 我确定了这个:

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

在这里借用。

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

如果这个列在你的表中已经存在,并且它是空的,你可以用这个命令更新这个列(替换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
这里有一个你可以尝试的主意。 原始表-没有标识列table1 创建一个新的表-调用表2和标识列。 将数据从table1复制到table2 -标识列自动填充自动递增的数字。< / p > 将原来的表- table1重命名为table3 将新表- table2重命名为table1(原始表) 现在已经有了包含标识列的表1,并为现有数据填充了标识列。 在确保没有问题并且工作正常后,在不再需要时删除表3。< / p >

创建一个新表,具有不同的名称和相同的列,主键和外键关联,并将其链接到您的插入代码语句中。 对于例如:对于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表,或者根据您的需求进行一些调整。

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

增加表的主键

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

你可以设置identity (1,1) 右击TBL =>设计=>部分左击(右击)=>属性=>在标识列选择#列

Properties .

身份列

如果你的表与其他使用主键或外键的表有关系,可能是不可能修改你的表。因此,您需要删除并重新创建表 要解决这些问题,您需要通过右键单击数据库来生成脚本,并在高级选项中设置数据到脚本到方案和数据的类型。在那之后,使用这个脚本,改变你的列来识别和重新生成表使用运行它的查询 你的查询就像这样:

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

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

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

alter table /**粘贴tabal的名称**/ add id int IDENTITY(1,1)

delete from /**粘贴tabal的名称**/ Where id in

select a.d id FROM /**粘贴tabal的名称/ as a. bb0 . bb0 左外连接( SELECT MIN(id) as id FROM /粘贴tabal的名称/ 集团 /粘贴列c1,c2 ....* * / < / p >

) as t1
ON a.id = t1.id

在t1。id为空

alter table /**粘贴tabal的名称**/ DROP COLUMN id

ALTER TABLE table_name ADD temp_col INT IDENTITY(1,1)
update

试试下面的代码:

DBCC CHECKIDENT ('settings', RESEED, 0)