T-SQL:在更改主键类型时何时删除并重新创建表?

时间:2018-03-14 11:41:07

标签: tsql sql-server-2012 primary-key alter-table changetype

我有以下表格:

CREATE TABLE B( Id  [uniqueidentifier] PRIMARY KEY NOT NULL,    [Name] varchar(100) NULL;
CREATE TABLE A (Id  [uniqueidentifier] PRIMARY KEY NOT NULL,    BId [uniqueidentifier] NOT NULL CONSTRAINT FK_A_B   FOREIGN KEY(BId)    REFERENCES dbo.B(Id));

这是一个简化的示例,实际上表中的其他列与问题无关。 我需要将两个表的主键列更改为int类型并自动增加BUT以将旧的Id值保留为GUID列 我的问题是: 哪种更改方式最好?有两种方法可以想到 - 第一种方法是删除B.Id上的所有索引,向B表添加新的标识列,对A.Id执行相同操作,然后向A(BId_New INT)添加新的空列,更新A然后使BId_New不为null。另一种方法是将表的数据保存到复制的表,截断A和B表,然后更改其模式并将复制的表中的值插入到实际的表中。哪种方式更好,在什么情况下?

1 个答案:

答案 0 :(得分:0)

  1. 在B表上创建新的Identity密钥,您可以将其定义为Not Null,因为identity属性将填充它。
  2. 删除表A上的FK约束
  3. 删除表B上的PK约束。如果您希望新PK也是聚簇索引,则可能还需要删除聚簇索引。我不确定删除PK约束是否也会删除聚集索引。
  4. 在标识属性
  5. 上创建新的PK约束
  6. 在A表中创建新的int属性。不要使用身份。
  7. 通过加入A&更新新的int属性B在GUID上并检索新的B主键
  8. 更改表A中的新列以将其更改为“非空”
  9. 创建FK约束以将表A链接到新的int键
  10. 上的表B.