Как я могу изменить ограничение первичного ключа с помощью синтаксиса 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
)
MNF
источник
-4

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

например:

EXEC sp_rename N'schema.MyIOldConstraint', N'MyNewConstraint'
Гаррет Тайджи
источник
3
Вопрос был в том, как изменить ограничение, т.е. ДОБАВИТЬ столбец, а не как переименовать.
Эндрю Стейтц