2009-12-24 58 views
3

我有一张桌子,我们称之为Users。该表具有名为Id的主键。尽管Id作为主键(唯一聚簇),但它在同一列(Id)上有其他索引(唯一非聚簇)。如何删除外键引用的唯一索引?

我想删除这个约束,但外键引用这个独特的非聚集索引,我得到The constraint ... is being referenced by table...错误。

删除此类索引的最佳方法是什么?你有没有脚本掉落,做些什么,并在特定表格的特定列上重新创建外键?有很多外键,所以如果我能自动完成它将会很好。我可以使用INFORMATION_SCHEMA和其他系统对象来提取关于这些键的信息,但我不想写,已经写入或可以用其他方式完成的内容。

回答

2

为了删除由外键引用的非聚簇索引,必须首先删除外键约束。

在SQL Server Central中查看海报中可用的以下脚本。他们可能需要对“确切”的需求进行一些调整,但它们提供了编写脚本并随后重建外键的基础。

Scrip out Foreign Keys

+0

此脚本比Andomar更好。它重新创建了CASCADE和SET NULL操作。 – LukLed 2009-12-30 13:58:16

+0

@LukLed:很高兴您同意;-) – 2009-12-30 19:36:43

+1

您能否在此提供脚本?谢谢。 – 2013-07-18 05:37:45

1

两个指数的做法是有意义的:

  • 第二个指标可能比聚簇索引要小得多,而且会更容易装入内存
  • 第二个指标可能包括选择列这有利于特定查询

要删除第二个索引,必须首先删除引用它的所有外键。这里是the script的链接,我用它来删除&重新创建外键。

+0

它有一列('ID'),不包括。对我来说这没有意义。 – LukLed 2009-12-24 10:49:56

+1

如果您使用ID列将此表连接到另一个表,它可能很有用。在这种情况下,只需加入ID,然后只查找匹配的行可能会比天真的方法更好。当然,如果您执行select some_list FROM some_other_table WHERE some_column IN(SELECT id FROM thetable) – erikkallen 2009-12-24 10:53:44

+0

@LukLed:聚集索引包含表中的所有列,只是“ID”的索引就是一列。像erikkallen的评论,较小的指数有优势 – Andomar 2009-12-24 10:59:41