Я хочу изменить существующий первичный ключ в таблице SQL Azure.
В настоящее время он имеет один столбец, и я хочу добавить другой.
Теперь на SQL Server 2008 это было просто, просто сделал это в SSMS, пуф. Выполнено. Вот как выглядит PK, если я пишу его с SQL Server:
ALTER TABLE [dbo].[Friend] ADD CONSTRAINT [PK_Friend] PRIMARY KEY CLUSTERED
(
[UserId] ASC,
[Id] ASC
)
Тем не менее, в SQL Azure, когда я пытаюсь выполнить вышеизложенное, это, конечно же, завершится ошибкой
Table 'Friend' already has a primary key defined on it.
Хорошо, поэтому я пытаюсь уронить ключ:
Tables without a clustered index are not supported in this version of SQL Server. Please create a clustered index and try again.
Итак, я пытаюсь создать временный кластерный индекс для удаления PK:
CREATE CLUSTERED INDEX IX_Test ON [Friend] ([UserId],[Id])
Что приводит к:
Cannot create more than one clustered index on table 'Friend'. Drop the existing clustered index 'PK_Friend' before creating another.
Отлично, момент уловки22.
Как добавить столбец UserId в мою существующую PK?
Ответы:
Примечание. Начиная с базы данных SQL Azure v12, эти ограничения больше не применяются.
Нет такого понятия, как «первичный индекс». Существует такая вещь, как «первичный ключ», а также такая вещь, как «кластерный индекс». Разные понятия, часто путают. Имея это в виду, давайте вернемся к вопросу:
В1) Можно ли изменить кластерный индекс в таблице SQL Azure?
A: Да. Используйте
WITH (DROP_EXISTING=ON)
:Q2) Можно ли изменить кластерный индекс таблицы с ограничением первичного ключа?
A: Да, так же, как и выше, до тех пор, пока ограничение первичного ключа не применяется через кластеризованный индекс:
В3) Можно ли изменить ограничение первичного ключа таблицы?
A: Да, если основное ограничение не применяется через кластеризованный индекс:
В4) Можно ли изменить первичный ключ таблицы, если он применяется через кластерный индекс?
A: Да, если в таблице никогда не было строк:
В5) Можно ли изменить первичный ключ таблицы, если он применяется через кластерный индекс, если таблица заполнена?
A: Нет. Любая операция, которая преобразует заполненный кластерный индекс в кучу, будет заблокирована в SQL Azure, даже если таблица пуста :
В качестве примечания: ограничение может быть изменено, если таблица усекается .
Обходной путь для изменения ограничения PK заполненной таблицы заключается в том, чтобы сделать старый добрый
sp_rename
трюк:sp_rename
Подход имеет некоторые проблемы, самое главное в том , что разрешения на столе не переносятся во время переименования, а также иностранных ключевых ограничений.источник