【问题标题】:T-SQL: When is dropping and recreating tables needed when changing the primary key type?T-SQL:更改主键类型时何时需要删除和重新创建表?
【发布时间】:2018-08-22 22:22:06
【问题描述】:

我有以下表格:

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 类型并自动递增但也将旧 Id 值保留为 GUID 列 我的问题是: 进行这些更改的最佳方法是什么?想到两种方法 - 第一种是删除 B.Id 上的所有索引,向 B 表添加一个新的标识列,对 A.Id 执行相同操作,然后向 A 添加一个新的空列(BId_New INT),更新 A然后使 BId_New 不为空。另一种方法是将表的数据保存到复制的表中,截断 A 和 B 表,然后更改它们的模式并将复制表中的值插入到实际表中。哪种方式更好,在什么情况下?

【问题讨论】:

  • 我认为您可以重命名它们以免于复制。无论哪种方式似乎都很好。

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


【解决方案1】:
  1. 在 B 表上创建新的 Identity 键,您可以将其定义为 Not Null 开始,因为身份属性将填充它。
  2. 删除表 A 上的 FK 约束
  3. 删除表 B 上的 PK 约束。如果您希望新的 PK 也成为聚集索引,则可能还需要删除聚集索引。我不确定删除 PK 约束是否也会删除聚集索引。
  4. 在身份属性上创建新的 PK 约束
  5. 在 A 表中创建新的 int 属性。不要使用身份。
  6. 通过在 GUID 上加入 A 和 B 并检索新的 B 主键来更新新的 int 属性
  7. 更改表 A 中的新列以将其更改为 Not Null
  8. 创建 FK 约束以在新的 int 键上将表 A 链接到表 B

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2011-03-22
    相关资源
    最近更新 更多