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


100

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

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


5
AFAIK да, вам нужно отбросить и воссоздать ограничение PK. Я не припомню ни одной команды для добавления столбца к уже существующему ограничению PK / FK.
Seramme

Ответы:


149

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

ALTER TABLE <Table_Name>
DROP CONSTRAINT <constraint_name>

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

11
Если вы не знаете имя ограничения первичного ключа, используйте найденный здесь запрос, чтобы найти его (или найдите и отбросьте все сразу). http://stackoverflow.com/a/13948609/945875
Джастин

если это не было ясно, или кто - то другой делает ту же ошибку, имя ограничения не может идти в кавычках alter table PatientsInfo drop constraint PK__Patients__1CBB51380A338187здесь работает
Маслоу

1
Для тех из вас, кто не знает имени ограничения: ALTER TABLE db. table УДАЛИТЬ ПЕРВИЧНЫЙ КЛЮЧ, ДОБАВИТЬ ПЕРВИЧНЫЙ КЛЮЧ ( id1, id2);
karsten314159

21

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


3

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


3

В моем случае я хочу добавить столбец к первичному ключу (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
)

-4

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

например:

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

3
Вопрос был в том, как изменить ограничение, т.е. ДОБАВИТЬ столбец, а не как переименовать.
Эндрю Стейтц
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.