2009-12-24 94 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