Answers:
否-您必须采用另一种方法:从一开始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
alter table attachments add ATTACHMENT_NUMBER int identity (1000, 1)
PRIMARY KEY
意味着NOT NULL
到位-再说一次-这不是绝对必要的。但是我更愿意讲清楚,所以我总是在NOT NULL
那里,只是要绝对清楚
PRIMARY KEY
,聚集索引会自动为您创建(除非你明确指定NONCLUSTERED
)
您无法“打开”身份:这是表重建。
如果您不关心数字顺序,则可以一次性添加IDENTITY的NOT NULL列。15万行不是很多。
如果需要保留一些数字顺序,则相应地添加数字。然后,使用SSMS表设计器设置IDENTITY属性。这使您可以生成一个脚本,该脚本将为您执行列删除/添加/保留数字/种子设置。
ALTER TABLE ... SWITCH
如果没有这样做就可以做到。
如果表中已经存在该列,并且该列为null,则可以使用以下命令(替换ID,表名和tablekey)更新该列:
UPDATE x
SET x.<Id> = x.New_Id
FROM (
SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
FROM <tablename>
) x
如果您的表使用其主键或外键与其他表有关系,则可能无法更改您的表。因此您需要删除并再次创建表。
要解决这些问题,您需要通过右键单击数据库并在高级选项中将数据类型设置为脚本以编写方案和数据来生成脚本。之后,将此脚本与更改您的列一起使用,以通过运行其查询来标识并重新生成该表。
您的查询将如下所示:
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表或根据需要进行一些调整。
该答案是投票最高的答案的一个很小的补充,适用于SQL Server。该问题要求自动递增主键,当前答案的确添加了主键,但未将其标记为自动递增。下面的脚本检查列是否存在,并在启用了autoincrement标志的情况下添加它。
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 temp_col INT IDENTITY(1,1)
update
alter table / **粘贴表格名称** /添加id int IDENTITY(1,1)
从/ **删除,粘贴表格名称** /,其中id为
(
选择a.id FROM / **粘贴制表符的名称/作为左外连接(SELECT MIN(id)as id FROM /粘贴制表符的名称/ GROUP BY / 粘贴列c1,c2 .... ** /
) as t1
ON a.id = t1.id
t1.id为NULL的位置
)
修改表/ **粘贴表格名称** / DROP COLUMN ID
尝试这样的事情(首先在测试表上):
使用your_database_name 走 (从your_table中选择COUNT(*),而your_id_field为NULL)> 0 开始 设置行数1 更新your_table SET your_id_field = MAX(您的id_field)+1 结束 打印“全部完成”
我根本没有测试过,所以要小心!
IDENTITY
列有关),无论如何都不起作用。UPDATE your_table SET your_id_field = MAX(your_id_field)+1
你不能只是卡在MAX
那儿。WHERE
避免重复更新同一行的子句在哪里?
ALTER TABLE ORDER ALTER COLUMN ORDERNO RESTART WITH 1
但我不想在没有专家检查的情况下尝试使用它:) pic.dhe.ibm.com/infocenter/iseries/v7r1m0/…– 2013