2010-09-01 104 views
3

我正在使用SQL Server 2008.我用作主键但不是标识列的一个int列(其值将自动增加1)。我想将此列转换为标识列。任何解决方案SQL Server将列转换为标识列

由于事先 乔治

回答

6

不幸的是,你不能在现有的表上将字段更改为IDENTITY

你应该:

  • 创建与IDENTITY
  • 问题SET IDENTITY_INSERT ON新表新表
  • 将数据插入到新表
  • 问题SET IDENTITY_INSERT OFF为新表
  • 丢弃旧表
  • 将新表重命名为旧名称。

您可以使用SSMS更改字段类型,它会在幕后为您做所有这些。

下面是一个示例表:

CREATE TABLE plain (id INT NOT NULL PRIMARY KEY) 

INSERT 
INTO plain 
VALUES (1000) 

SSMS生成的脚本:

SET ANSI_PADDING ON 
SET ANSI_WARNINGS ON 
COMMIT 
BEGIN TRANSACTION 
GO 
CREATE TABLE dbo.Tmp_plain 
    (
    id int NOT NULL IDENTITY (1, 1) 
    ) ON [PRIMARY] 
GO 
ALTER TABLE dbo.Tmp_plain SET (LOCK_ESCALATION = TABLE) 
GO 
SET IDENTITY_INSERT dbo.Tmp_plain ON 
GO 
IF EXISTS(SELECT * FROM dbo.plain) 
    EXEC('INSERT INTO dbo.Tmp_plain (id) 
     SELECT id FROM dbo.plain WITH (HOLDLOCK TABLOCKX)') 
GO 
SET IDENTITY_INSERT dbo.Tmp_plain OFF 
GO 
DROP TABLE dbo.plain 
GO 
EXECUTE sp_rename N'dbo.Tmp_plain', N'plain', 'OBJECT' 
GO 
ALTER TABLE dbo.plain ADD CONSTRAINT 
    PK__plain__3213E83F1A609306 PRIMARY KEY CLUSTERED 
    (
    id 
    ) WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

GO 
COMMIT 
+1

@Quassnoi - +1值得一提的是,为了将数据插入到新的Identity列中,OP将不得不使用'SET IDENTITY_INSERT ON | OFF' – codingbadger 2010-09-01 10:05:30

+1

@Barry:好的一点,谢谢 – Quassnoi 2010-09-01 10:08:41

+0

为什么我需要SET IDENTITY_INSERT终于关了?我想我需要在桌面上启用身份列。我应该打开它? – George2 2010-09-01 10:17:44

2

转到在SQL Server对象资源管理器的表对象右击表说修改,比上一个字段,它是要转换身份的主键单击,比下面你会看到列属性,那么你需要改变为(是身份证)是和身份标识增量1.

+0

是的,它会做到这一点,但是这是一个糟糕的技术使用。它的确如上面描述的那样,但是如果你要对表格进行修改,他们不应该通过GUI来完成,而只能通过放置在Source控件中的脚本来完成。这确保了流程在所有服务器上都得到了测试和正确运行,并且不会犯错误,也不会有变更的历史记录以及是谁制作的。 T-SQl是代码,应该这样处理。 – HLGEM 2010-09-01 15:33:42

+1

他没有要求剧本,也没有提到任何其他你需要担心的环境。我以为他只是想改变它。对于上述问题,我认为最简单的方法就是通过UI来完成。 – apprich 2010-09-01 15:49:12