如何在不丢弃SQL Server 2005中引用外键的情况下将群集主键转换为非群集主键

alp*_*pav 5 sql sql-server-2005 foreign-keys primary-key clustered-index

我在GUID列上创建聚簇主键时犯了错误.有许多表引用具有已定义外键的表.表大小不重要.

我想将它从群集转换为非群集,而无需手动删除和重新创建任何外键甚至主键约束.

是否有可能在MS SQL2005中实现这一点,如果是的话?

如果是的话,是否可以实现ONLINE(没有db停机时间)?

gbn*_*gbn 3

您可以尝试先创建唯一的非聚集NC索引,然后删除聚集PK。FK 应该识别这个其他索引(但可能不会:从未尝试过)。

当您运行 ALTER TABLE 删除集群 PK 时,请使用ONLINE选项。但是,它仅在企业版中可用。

ALTER TABLE Mytable DROP CONSTRAINT PK_Mytable WITH (ONLINE = ON)
Run Code Online (Sandbox Code Playgroud)

您不能将 ONLINE 用于 ADD CONSTRAINT 位。

基本上,您的选择是有限的,不会阻塞,或者先创建另一个表并将数据移动到...

  • FK 无法识别其他索引。当我尝试删除 PK 约束时,即使在创建另一个唯一约束并使用 ALTER TABLE Table2 NOCHECK CONSTRAINT FK_Table2_Table1 禁用外键约束后,它会抱怨“约束 'PK_Table1' 被表 'Table2' 引用,外键约束 'FK_Table2_Table1' . 只有删除 FK 才有效。 (2认同)