2011-02-01 219 views
182

作为标题,我有一个现有的表已经填充了150000条记录。我添加了一个Id列(当前为空)。SQL Server将自动增加主键添加到现有表

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

回答

310

没有 - 你必须围绕做它的其他方式:直接从添加它一开始去为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 
+0

我使用phpMyAdmin界面。尝试使用“IDENTITY”关键字时,我收到了SQL错误,这在GUI中也不可用。它工作时,我添加了AUTO_INCREMENT选择一个新行,其类型为INT主要。 – daveagp 2012-02-17 19:09:05

+0

Identity关键字是特定于SQL Server的。 Auto_Increment是您找到的MySQL版本。 http://stackoverflow.com/questions/10283780/equivalent-of-mssql-identity-column-in-mysql – AndyMcKenna 2012-12-03 13:46:46

+2

这是一个非常好的答案,但我如何将起始整数从1改为1000?我想从1000开始计数。我怀疑我可以使用`ALTER TABLE ORDER ALTER COLUMN ORDERNO RESTART WITH 1`,但我不想在没有与专家核对的情况下尝试它。 http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Fsqlp%2Frbafysqlpidentity.htm – user1477388 2013-03-08 18:22:39

18

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

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

如果您需要保留一些号码顺序,则相应地添加号码。然后使用SSMS表设计器设置IDENTITY属性。这使您可以生成一个脚本,它将为您执行列删除/添加/保留编号/重新编号。

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

我没有测试过这在所有的,所以一定要小心!

8

我有这个问题,但无法使用标识列(出于各种原因)。 我看中了这个:

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

here借来的。

2

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

2

如果列在表中已经存在,它为空,则可以更新与此命令列(更换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 
0

这里有一个想法,你可以试试。 原始表格 - 无标识列表1 创建一个新表格 - 调用table2以及标识列。 将table1中的数据复制到table2 - 标识列会自动填充自动递增的数字。

命名原始表 - 表1至表3 重命名新表 - 表2至表1(原始表) 现在你已经列入并填充为现有的数据与标识列的表1。 确认没有问题并且正常工作后,不再需要时放下表格3。

0

使用不同的名称和相同的列,主键和外键关联创建一个新表,并将其链接到Insert语句的代码中。 对于E.g:对于员工,用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表或根据您的需求做一些调整。

-3

这工作在MariaDB的,所以我只能希望它在SQL Server中:下降你刚插入的ID列,然后使用下面的语法: -

ALTER TABLE表名ADD ID INT PRIMARY KEY AUTO_INCREMENT ;

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

1

由你可以设置标识(1,1) 右键单击设计TBL =>德兴=>部分左(右单击)=>属性=>在标识列选择#column

Properties

​​

0

如果你的表中有在其主或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