Как преобразовать кластерный первичный ключ в некластеризованный, не теряя ссылки на внешние ключи в SQL Server 2005

Я сделал ошибку, создав кластерный первичный ключ в столбце GUID. Есть много таблиц, которые ссылаются на эту таблицу с определенными внешними ключами. Размер таблицы не имеет значения.

Я хотел бы преобразовать его из кластеризованного в некластеризованный без ручного удаления и воссоздания каких-либо внешних ключей или даже ограничения первичного ключа.

Возможно ли добиться этого в MS SQL2005 и как, если да?

Возможно ли достичь этого ОНЛАЙН (без простоя db), если да?


person alpav    schedule 18.02.2010    source источник


Ответы (1)


Вы можете сначала попробовать создать уникальный некластеризованный индекс NC, а затем отбросить кластерный PK. FK должен распознать этот другой индекс (но может и не распознать: никогда не пробовал).

Когда вы запускаете ALTER TABLE, чтобы удалить кластерный PK, используйте ONLINE вариант. Однако он доступен только в версии Enterprise.

ALTER TABLE Mytable DROP CONSTRAINT PK_Mytable WITH (ONLINE = ON)

Вы не можете использовать ONLINE для бита ADD CONSTRAINT.

По сути, ваши возможности ограничены без блокировки или создания сначала другой таблицы и переноса данных ...

person gbn    schedule 19.02.2010
comment
@alpav: к сожалению, я бы просто бросил, исправил, воссоздал. И попробуйте вспомнить в следующий раз :-) Попробуйте это с таблицей из 200 миллионов строк: это больно ... - person gbn; 22.02.2010
comment
FK не распознают другой индекс. Когда я пытаюсь отказаться от ограничения PK даже после создания другого уникального ограничения и отключения ограничения внешнего ключа с помощью ALTER TABLE Table2 NOCHECK CONSTRAINT FK_Table2_Table1, он жалуется, что на ограничение PK_Table1 ссылается таблица Table2, ограничение внешнего ключа FK_Table2_Table1. Работает только сброс FK. - person alpav; 11.03.2010