作为标题,我有一个已经填充了150000条记录的现有表格。我添加了一个Id列(当前为null)。
我假设我可以运行查询以使用增量编号填充此列,然后设置为主键并启用自动增量。这是正确的方法吗?如果是这样,我如何填写初始数字?
答案 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)
答案 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; 这可能很有用