Как изменить ограничение первичного ключа с помощью синтаксиса SQL?

У меня есть таблица, в которой отсутствует столбец в его основном ключевом ограничении. Вместо того, чтобы редактировать его через SQL Server, я хочу поместить его в script, чтобы добавить его как часть наших скриптов обновлений.

Какой синтаксис я могу использовать для этого? Должен ли я отбрасывать и воссоздавать ограничение ключа?

Ответ 1

Да. Единственный способ - сбросить ограничение с помощью таблицы Alter, а затем воссоздать его.

ALTER TABLE <Table_Name>
DROP CONSTRAINT <constraint_name>

ALTER TABLE <Table_Name>
ADD CONSTRAINT <constraint_name> PRIMARY KEY (<Column1>,<Column2>)

Ответ 2

PRIMARY KEY CONSTRAINT не может быть изменен, вы можете удалить его и снова создать. Для больших наборов данных это может привести к длительному времени работы и, следовательно, недоступности таблицы.

Ответ 3

Производительность разумна, нет смысла удерживать некластеризованные индексы во время этого, так как они будут обновляться при удалении и создании. Если это большой набор данных, вам следует переименовать таблицу (если возможно, какие-либо параметры безопасности на ней?), Повторно создавая пустую таблицу с правильными ключами, перенося все данные там. Вы должны убедиться, что у вас достаточно места для этого.

Ответ 4

Ответ @darnir можно упростить, используя:

ALTER TABLE <Table_Name> DROP PRIMARY KEY, ADD PRIMARY KEY(<Column1>, <Column2>)

Ответ 5

В моем случае я хочу добавить столбец к первичному ключу (column4). Я использовал этот скрипт для добавления column4

ALTER TABLE TableA
DROP CONSTRAINT [PK_TableA]

ALTER TABLE TableA
ADD CONSTRAINT [PK_TableA] PRIMARY KEY (
    [column1] ASC,
    [column2] ASC, 
    [column3] ASC,
    [column4] ASC
)

Ответ 6

вы можете переименовать объекты ограничений с помощью sp_rename (как описано в этот ответ)

например:

EXEC sp_rename N'schema.MyIOldConstraint', N'MyNewConstraint'