如何用我桌面上的新主键替换现有的主键?

时间:2011-08-02 03:57:25

标签: sql sql-server database-design database-schema

我正在使用旧的SQL Server数据库,该数据库的核心表包含错误的主键。

密钥是NVARCHAR(50)类型,包含基于表中各种内容的应用程序生成的字符串。出于显而易见的原因,我想将此密钥替换为自动递增(标识)INT列。

这是一个庞大的数据库,我们正在逐步升级它。我们希望最小化对其他组件写入的表的更改。我想我可以通过以下方式更改表格而不会破坏任何内容:

  1. 将新Id列添加到表中并使其可为空
  2. 使用唯一整数填充并使其NOT NULL
  3. 删除现有主键,同时确保该列上仍存在唯一性约束
  4. 将新的Id列设置为新的主键和标识
  5. 第3项证明非常痛苦。因为这是一个核心表,所以其他表的 lot 都有外键约束。要删除现有的主键,我似乎必须删除所有这些外键约束并在之后再次创建它们。

    是否有更简单的方法可以执行此操作,还是只需编写所有脚本?

2 个答案:

答案 0 :(得分:1)

害怕这是坏消息。我们刚刚完成了一个做同样类型事情的大项目,尽管我们的主管DBA有一些技巧。您可能会查看this之类的内容,以便为翻转开关生成脚本:

答案 1 :(得分:1)

我曾经做过同样的事情并且基本上使用了你描述的过程。除此之外,您必须先访问彼此的表并添加指向基表中新列的新外键

所以我使用的方法是

  1. 在基表中添加一个带有自动递增整数的新列,确保它上面有唯一索引(以后由主键替换)
  2. 对于指向基表的每个外键关系,在子表中添加一个新列。 (注意,如果有多个关系,这可能导致在子表中添加多个列)
  3. 对于子表中键的每个实例,在新外键字段中输入值
  4. 替换您的外键关系,以便新列现在提供
  5. 使基表中的新列成为主要
  6. 删除基表中的旧主键和每个旧外键 孩子。
  7. 这是可行的,并不像最初听起来那么难。关键是一系列性质的儿童表的更新声明

    Update child_table
    set new_column = (select new_primary from base)
    where old_primary = old_foreign