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

+0

@LukLed: Рад вас одобрить ;-) –

+1

Не могли бы вы предоставить сценарий здесь? Благодарю. –

1

Два-индекса подход может иметь смысл:

  • Второй индекс, вероятно, гораздо меньше, чем кластерный индекс, и будет более легко помещается в памяти
  • Второй индекс может включать в себя выбор столбцов что выгодные конкретные запросы

Для удаления второго индекса вам придется сначала удалить все внешние ключи, которые ссылаются на него. Вот ссылка на the script Я использую для удаления & воссоздать внешние ключи.

+0

Он имеет один столбец ('ID'), не включает в себя. Для меня это бессмысленно. – LukLed

+1

Это может быть полезно, если вы присоедините эту таблицу к другой, используя столбец идентификатора. В этом случае просто присоединение к идентификатору, а затем поиск только соответствующих строк может быть лучше, чем наивный подход. И, конечно, было бы полезно, если бы вы сделали SELECT some_list FROM some_other_table WHERE some_column IN (SELECT id FROM the_table) – erikkallen

+0

@LukLed: кластерный индекс содержит все столбцы в таблице, индекс только для «ID» всего один столбец. Как и комментарии erikkallen, меньший индекс имеет преимущества – Andomar