Подтвердить что ты не робот

ALTER TABLE в зависимой колонке

Я пытаюсь изменить тип данных столбца первичного ключа на tinyint из int.This этот столбец является внешним ключом в других таблицах. Поэтому я получаю следующую ошибку:


Msg 5074, уровень 16, состояние 1, строка 1 Объект 'PK_User_tbl' является зависит от столбца 'appId'. Msg 5074, уровень 16, состояние 1, строка 1 объект "FK_Details_tbl_User_tbl" зависит от столбца "appId". Msg 5074, уровень 16, состояние 1, строка 1 Объект 'FK_Log_tbl_User_tbl' является зависит от столбца 'appId'. Msg 4922, уровень 16, состояние 9, строка 1 ALTER TABLE ALTER COLUMN appId не удалось, поскольку доступ к одному или нескольким объектам этот столбец.


Есть ли другой способ, кроме удаления зависимостей и воссоздания?

4b9b3361

Ответ 1

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

ALTER TABLE [dbo.Details_tbl] DROP CONSTRAINT [FK_Details_tbl_User_tbl];
-- Perform more appropriate alters
ALTER TABLE [dbo.Details_tbl] ADD FOREIGN KEY (FK_Details_tbl_User_tbl) 
    REFERENCES User_tbl(appId);
-- Perform all appropriate alters to bring the key constraints back

Однако, если память не является действительно большой проблемой, я бы сохранил идентификатор как INT. Если вы на 100% не уверены, что ваши ключи никогда не будут расти после ограничений TINYINT. Просто предостережение:)

Ответ 2

Если ваше ограничение относится к типу пользователя, то не забудьте посмотреть, есть ли Default Constraint, обычно что-то вроде DF__TableName__ColumnName__6BAEFA67, если это так, вам нужно будет сбросить Default Constraint, например:

ALTER TABLE TableName DROP CONSTRAINT [DF__TableName__ColumnName__6BAEFA67]

Для получения дополнительной информации см. комментарии блестящего Аарона Бертрана на этом ответе.