应用程序正在使用具有 ID 列的 SQL Server 2008 数据库,但这些列不是主键并且没有IDENTITY
属性。
我现在需要做的是添加 PK 和IDENTITY
属性。但是,必须保留旧 ID。
此外,我需要使用 SQL 命令(无 GUI)来执行此操作。
问题
我尝试了以下所有解决方案,但没有成功。
- 我不能直接
INSERT
/UPDATE
一个IDENTITY
值 - 我不能同时禁用
IDENTITY
多个表的约束 - 我无法复制数据
ALTER TABLE ... SWITCH TO
(如果源表没有 PK 并且目标表有 PK,则它不起作用) 我不能使用序列代替
IDENTITY
s 作为主键,因为 2008 不支持序列以下也不起作用:
SET IDENTITY_INSERT mydb.dbo.AZIENDE_NEW ON; INSERT INTO mydb.dbo.AZIENDE_NEW SELECT * FROM mydb.dbo.AZIENDE_OLD;
我收到错误
消息 8101:表 'mydb.dbo.AZIENDE_NEW' 中标识列的显式值只能在使用列列表并且 IDENTITY_INSERT 为 ON 时指定
这在我看来是不合逻辑的。IDENTITY_INSERT
应该是ON
为了那张桌子...
我对其他解决方案持开放态度,但我没有更多想法。
最简单的方法是使用 SSMS GUI,右键单击设计器并使用“生成脚本”。这将为您生成一个表重建,该重建保留数据并为您进行架构更改。
如果您关心性能,则需要使用该
SWITCH
技术。使两个表的架构与 switch 兼容,然后切换,然后再更改架构。这样,您可以在IDENTITY
不移动(或减少)数据移动的情况下添加属性。是的,这行不通。创建与 switch 一起使用的兼容表。您可以很好地切换堆,但双方都需要是堆。
您可以自己编写重建脚本。