【问题标题】:How to delete unique index referenced by foreign keys?如何删除外键引用的唯一索引?
【发布时间】:2010-12-29 18:58:47
【问题描述】:

我有一张桌子,我们称之为Users。该表的主键名为Id。尽管有 Id 作为主键(唯一聚集),但它在同一列上有其他索引(唯一非聚集)(Id)。

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

删除此类索引的最佳方法是什么?您是否有任何脚本可以在特定表中的特定列上删除、执行某些操作并重新创建外键?有很多外键,所以如果我能自动完成就好了。我可以使用 INFORMATION_SCHEMA 和其他系统对象来提取有关这些键的信息,但我不想写已经写好的或可以以其他方式完成的内容。

【问题讨论】:

    标签: sql sql-server sql-server-2000 foreign-keys indexing


    【解决方案1】:

    双索引方法可能有意义:

    • 第二个索引可能比聚集索引小得多,并且更容易放入内存中
    • 第二个索引可能包含有利于特定查询的列选择

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

    【讨论】:

    • 它只有一列 (ID),不包括在内。对我来说这毫无意义。
    • 如果您使用 ID 列将此表连接到另一个表,这可能会很有用。在这种情况下,只加入 ID,然后只查找匹配的行可能比天真的方法更好。而且,当然,如果您执行 SELECT some_list FROM some_other_table WHERE some_column IN(SELECT id FROM the_table)
    • @LukLed:聚集索引包含表中的所有列,仅ID 上的索引仅包含一列。与 erikkallen cmets 一样,较小的索引具有优势
    • @erikkallen, Andomar:那么您是否会在主键上创建额外的索引来加快加入速度?你经常这样做吗?我了解好处,但它真的比聚集索引工作得快得多吗?特别是当您从连接表中选择数据时。
    • 现在内存非常便宜,我们的服务器可以在内存中容纳所有聚集索引。但是,对于我们的旧服务器,我们确实受益于非聚集主键索引。例如,我们将在 id, status 上创建一个索引,以便您可以在内存中搜索未结订单
    【解决方案2】:

    要删除由外键引用的非聚集索引,您必须首先删除外键约束。

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

    Scrip out Foreign Keys

    【讨论】:

    • 这个脚本比 Andomar 好。它重新创建 CASCADE 和 SET NULL 操作。
    • @LukLed:很高兴你同意 ;-)
    • 您能在这里提供脚本吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2020-10-01
    • 1970-01-01
    • 2019-10-23
    • 2010-10-09
    • 1970-01-01
    相关资源
    最近更新 更多