如何以编程方式将非标识列更改为标识列?

时间:2009-04-16 14:23:54

标签: sql sql-server sql-server-2005 tsql identity

我有一个列ID的表,它是一个标识符。接下来,我创建新的非标识列new_ID,并使用ID列+ 1中的值更新它。如下所示:

new_ID = ID + 1

接下来,我删除ID列并将new_ID重命名为name'ID'。

如何在这个新列“ID”上设置标识?

我想以编程方式执行此操作!

5 个答案:

答案 0 :(得分:5)

据我所知,您必须创建一个临时表,其ID字段创建为IDENTITY,然后复制原始表中的所有数据。最后,删除原始表并重命名临时表。这是一个表(名为 TestTable )的示例,该表只包含一个名为ID的字段(整数,非IDENTITY):

BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_TestTable
    (
    ID int NOT NULL IDENTITY (1, 1)
    )  ON [PRIMARY]
GO
SET IDENTITY_INSERT dbo.Tmp_TestTable ON
GO
IF EXISTS(SELECT * FROM dbo.TestTable)
     EXEC('INSERT INTO dbo.Tmp_TestTable (ID)
        SELECT ID FROM dbo.TestTable WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_TestTable OFF
GO
DROP TABLE dbo.TestTable
GO
EXECUTE sp_rename N'dbo.Tmp_TestTable', N'TestTable', 'OBJECT' 
GO
COMMIT

答案 1 :(得分:2)

看起来SQL Mobile支持更改列标识但SQL Server 2005不喜欢BOL中的示例。

所以你的选择是创建一个带有标识列的新临时表,然后打开Identity Insert:

Create Table Tmp_MyTable ( Id int identity....)

SET IDENTITY_INSERT dbo.Tmp_Category ON

INSERT Into Tmp_MyTable (...)
Select From MyTable ....

Drop Table myTable

EXECUTE sp_rename N'dbo.Tmp_MyTable', N'MyTable', 'OBJECT' 

此外,您可以尝试首先将列添加为标识列,然后打开标识插入。然后删除原始列。但我不确定这是否有效。

答案 2 :(得分:1)

猜猜你的任务没有多少运气......

在表格设计中,您应该能够进入属性并在“身份规范”更改(“身份”)下更改为“是”,并在以前拥有主键的情况下分配列主键。

答案 3 :(得分:1)

答案 4 :(得分:0)

Identity是在创建表或在alter table语句中添加新列时设置的属性。您无法更改列并将其设置为标识,并且在同一个表中不可能有两个标识列。

根据表的大小,是否可以简单地创建一个新表?复制旧模式的模式,然后使用SET IDENTITY_INSERT ON将新标识列填充到旧标识列中。