将 PRIMARY KEY 和 IDENTITY 属性添加到 SQL Server 2008 表

Fed*_*oli 5 sql-server identity

应用程序正在使用具有 ID 列的 SQL Server 2008 数据库,但这些列不是主键且没有IDENTITY属性。

我现在需要做的是添加 PK 和IDENTITY属性。但是,必须保留旧 ID。

此外,我需要使用 SQL 命令(无 GUI)来执行此操作。

问题

我尝试了以下所有解决方案,但没有成功。

  • 我不能直接INSERT/UPDATE一个IDENTITY
  • 我不能同时禁用IDENTITY多个表的约束
  • 我无法复制数据ALTER TABLE ... SWITCH TO(如果源表没有 PK 而目标表有 PK 则不起作用)
  • 我不能使用序列代替IDENTITYs 作为主键,因为 2008 不支持序列

  • 以下也不起作用:

    SET IDENTITY_INSERT mydb.dbo.AZIENDE_NEW ON;
    
    INSERT INTO mydb.dbo.AZIENDE_NEW 
        SELECT * 
        FROM mydb.dbo.AZIENDE_OLD;
    
    Run Code Online (Sandbox Code Playgroud)

我得到错误

消息 8101:只有在使用列列表且 IDENTITY_INSERT 为 ON 时,才能指定表 'mydb.dbo.AZIENDE_NEW' 中标识列的显式值

这在我看来是不合逻辑的。IDENTITY_INSERT应该是ON那个桌子...

我对其他解决方案持开放态度,但我没有更多想法。

usr*_*usr 6

最简单的方法是使用 SSMS GUI,右键单击设计器并使用“生成脚本”。这将为您生成一个表重建,以保留数据并为您更改架构。

如果您关心性能,则需要使用该SWITCH技术。使两个表的模式与 switch 兼容,然后切换,然后将模式更改回来。这样您就可以在IDENTITY没有(或减少)数据移动的情况下添加属性。

从没有 PK 的表切换到有 PK 的表

是的,那行不通。创建与 switch 一起使用的兼容表。你可以切换堆就好了,但是两边都需要是堆。


您可以自己编写重建脚本。

  1. 创建一个具有所需架构的表
  2. 该表上的 IDENTITY_INSERT ON
  3. INSERT...SELECT 数据到该表
  4. DBCC CHECKIDENT(RESEED) 临时表
  5. 删除原表,将临时表重命名为原名称