Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql SQL Server将列转换为标识列_Tsql_Sql Server 2008 - Fatal编程技术网

Tsql SQL Server将列转换为标识列

Tsql SQL Server将列转换为标识列,tsql,sql-server-2008,Tsql,Sql Server 2008,我正在使用SQLServer2008。一个int列用作主键,但不是identity列(其值将自动增加1)。我想将此列转换为标识列。有什么解决办法吗 提前感谢,, George在sql server的对象资源管理器中转到您的表对象右键单击一个表,然后单击要转换为标识的主键字段,然后在下面您将看到列属性,在那里您需要更改为(is identity)Yes和Idendity Increment 1 不幸的是,您无法将现有表上的字段更改为IDENTITY 你应该: 使用IDENTITY字段创建一个新表

我正在使用SQLServer2008。一个int列用作主键,但不是identity列(其值将自动增加1)。我想将此列转换为标识列。有什么解决办法吗

提前感谢,,
George

在sql server的对象资源管理器中转到您的表对象右键单击一个表,然后单击要转换为标识的主键字段,然后在下面您将看到列属性,在那里您需要更改为(is identity)Yes和Idendity Increment 1

不幸的是,您无法将现有表上的字段更改为
IDENTITY

你应该:

  • 使用
    IDENTITY
    字段创建一个新表
  • 为新表发出
    设置标识\u插入
  • 将数据插入新表
  • 为新表发出
    设置标识\u 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

@Quassnoi-+1值得一提的是,为了在数据中插入新标识列,OP必须使用
设置标识\u insert ON | OFF
为什么我需要设置标识\u insert OFF?我想我需要在表上启用标识列。我应该将其设置为?
@George2
IDENTITY\u INSERT
允许在列中插入任意值。这不是一个标准行为:通常,您应该让
IDENTITY
来生成值。并且不要忘记,在执行此操作之前,您必须编写脚本并删除任何FK约束(或者它不允许您删除表),然后在完成后将其重新启用。是的,这样做可以,但这是一种不好的使用技术。它实现了@Quassnoi上面描述的功能,但如果您要对表进行更改,则不应通过GUI进行更改,而应仅通过放置在源代码管理中的脚本进行更改。这样可以确保在所有服务器上正确测试和运行该流程,不会出现错误,并且具有更改历史记录以及更改者。T-SQl是代码,应该这样对待。他并没有要求提供脚本,也并没有提到你们需要担心的任何其他环境。我以为他只是想改变它。对于上面提到的问题,我认为最简单的方法是用UI做。