Как обновить первичный ключ

Вот моя проблема: у Меня есть 2 таблицы:

  1. РАБОЧИЙ, со столбцами |ID|OTHER_STAF| , где идентификатор является первичным ключом
  2. ФИРМА, со столбцами |FPK|ID|SOMETHING_ELSE| , где комбинация, FPK и идентификатор делают первичный ключ и также идентификатор, является внешним ключом, на который ссылаются к WORKER.ID (не пустой, и должен иметь то же значение как в РАБОЧЕМ).

Я хочу сделать хранимую процедуру UPDATE_ID_WORKER, где я хотел бы изменить значение определенного идентификатора в РАБОЧЕМ, и также во всех экземплярах определенного значения идентификатора в ФИРМЕ.

хранимая процедура:

........ @id..????........

25
задан Moak 17 July 2017 в 07:13
поделиться

3 ответа

На самом деле вы не должны этого делать, а вместо этого вставьте новую запись и обновите ее таким образом.
Но, если вам действительно нужно, вы можете сделать следующее:

  • Временно отключить принудительное применение ограничений FK (например, ALTER TABLE foo WITH NOCHECK CONSTRAINT ALL )
  • Затем обновите свой PK
  • Затем обновите свои FK, чтобы они соответствовали изменению PK
  • Наконец, включите обратное принудительное применение ограничений FK
32
ответ дан 28 November 2019 в 18:00
поделиться

Когда вы сочтете необходимым обновить значение первичного ключа, а также все совпадающие внешние ключи, то необходимо исправить весь дизайн.

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

например:

BadUserTable
UserID     varchar(20) primary key --user last name
other columns...

когда вы создаете множество таблиц, у которых есть FK to UserID, чтобы отслеживать все, над чем работал пользователь, но затем этот пользователь женится и хочет, чтобы идентификатор совпадал с его новой фамилией, вы повезло.

GoodUserTable
UserID    int identity(1,1) primary key
UserLogin varchar(20) 
other columns....

Теперь вы FK суррогатного первичного ключа для всех других таблиц и отображаете UserLogin, когда это необходимо, позволяя им входить в систему, используя это значение, а когда им нужно изменить его, вы меняете его только в одном столбце одной строки.

5
ответ дан 28 November 2019 в 18:00
поделиться

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

В идеале, если вам нужно уникальное поле, которое можно обновлять, создайте новое поле.

2
ответ дан 28 November 2019 в 18:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: