如题,我有一个已经填充了150000条记录的现有表格。我添加了一个Id列(目前为空)。
我假设我可以运行一个查询来使用递增数字填充此列,然后将其设置为主键并开启自动递增。这是正确的操作方式吗?如果是,那么我该如何填充初始数字?
如题,我有一个已经填充了150000条记录的现有表格。我添加了一个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:它是表重建。
如果您不关心编号顺序,可以一次性添加带有IDENTITY的NOT NULL列。150k行并不算多。
如果您需要保留某些编号顺序,则相应地添加数字。然后使用SSMS表设计器设置IDENTITY属性。这使您可以生成一个脚本,该脚本将为您执行列删除/添加/保留数字/重新排列的操作。
ALTER TABLE ... SWITCH
可以在不需要这样做的情况下完成。 - Martin Smith我遇到了这个问题,但由于各种原因无法使用标识列。 我最终采用了这种方式:
DECLARE @id INT
SET @id = 0
UPDATE table SET @id = id = @id + 1
本文内容参考自这里。
UPDATE x
SET x.<Id> = x.New_Id
FROM (
SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
FROM <tablename>
) x
ALTER TABLE table_name ADD temp_col INT IDENTITY(1,1)
update
这个答案是对最高票答案的小补充,与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
当我们在现有表中添加一个标识列时,它会自动填充,无需手动填充。
如果您的表使用其主键或外键与其他表存在关系,则可能无法更改您的表。因此,您需要删除并重新创建该表。
要解决这些问题,您需要通过右键单击数据库并在高级选项中将数据类型设置为脚本以方案和数据的方式生成脚本。然后,使用此脚本更改您的列以识别并运行其查询以重新生成表。
您的查询将如下所示:
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
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 表或根据您的要求进行一些调整。
ALTER TABLE ORDER ALTER COLUMN ORDERNO RESTART WITH 1
,但我不想在未经专家确认之前尝试它 :) 参考:http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Fsqlp%2Frbafysqlpidentity.htm - user1477388alter table attachments add ATTACHMENT_NUMBER int identity (1000, 1)
。 - user1477388