【发布时间】:2011-10-17 22:30:38
【问题描述】:
我正在使用旧版 SQL Server 数据库,该数据库的核心表带有错误的主键。
键的类型为NVARCHAR(50),包含应用程序根据表中的各种内容生成的字符串。出于显而易见的原因,我想将此键替换为自动递增(身份)INT 列。
这是一个巨大的数据库,我们正在逐步升级它。我们希望最小化对其他组件写入的表的更改。我想我可以改变桌子而不会破坏任何东西:
- 将新的 Id 列添加到表中并使其可以为空
- 用唯一的整数填充它并使其成为
NOT NULL - 删除现有主键,同时确保该列上仍有唯一性约束
- 将新的 Id 列设置为新的主键和标识
事实证明,第 3 项非常痛苦。因为这是一个核心表,所以有 lot 其他表具有外键约束。要删除现有的主键,我似乎必须删除所有这些外键约束并在之后再次创建它们。
有没有更简单的方法可以做到这一点,还是我只需要编写所有脚本?
【问题讨论】:
-
快速问题: 1. 当您说删除此主键时,您并不是说删除列,对吗? 2. 您是否尝试禁用其他表上的外键约束:ALTER TABLE
NOCHECK CONSTRAINT 。这可能会帮助您完成第 4 点,并在完成后重新启用 fk 约束 -
1.正确 - 我实际上想保持所有外键约束不变。我没有尝试禁用它们,但错误表明我需要实际删除它们。不过我可以试试吗?
-
不,我认为您根本不需要删除它们。只需禁用它们,做你的事情并再次重新启用它们。 @ericb 链接的脚本做同样的事情。 ALTER TABLE
NOCHECK CONSTRAINT 禁用和 ALTER TABLE CHECK CONSTRAINT 启用 -
好的,我尝试禁用它们,然后进行更改。不幸的是,当我尝试删除主键时它就失败了。但 drop 和 recreate 方法有效。
标签: sql sql-server database-design database-schema