Можем ли мы обновить значения первичного ключа таблицы? - PullRequest
27 голосов
/ 01 октября 2010

Можем ли мы обновить значения первичного ключа таблицы?

Ответы [ 6 ]

38 голосов
/ 01 октября 2010

Общепринято, что первичные ключи должны быть неизменяемыми (или настолько стабильными, насколько это возможно , поскольку неизменяемость не может быть применена в БД).Хотя ничто не помешает вам обновить первичный ключ (кроме ограничения целостности), это может быть не очень хорошей идеей:

С точки зрения производительности:

  • Выпотребуется обновить все внешние ключи, которые ссылаются на обновленный ключ.Одно обновление может привести к обновлению потенциально большого количества таблиц / строк.
  • Если внешние ключи неиндексированы (!!), вам придется поддерживать блокировку дочерней таблицы для обеспечения целостности.Oracle будет удерживать блокировку только в течение короткого времени, но, тем не менее, это страшно.
  • Если ваши внешние ключи проиндексированы (как и должно быть), обновление приведет к обновлению индекса (delete + insertв структуре индекса), это, как правило, дороже, чем фактическое обновление базовой таблицы.
  • В таблицах INDGANIZATION INDEX (в других СУБД см. кластерный первичный ключ) строки физически сортируются по первичному ключу,Логическое обновление приведет к физическому удалению + вставке (более дорогое)

Другие соображения:

  • Если на этот ключ ссылается какая-либо внешняя система (кэш приложения, другойБД, экспорт ...), ссылка будет прервана после обновления.
  • дополнительно, некоторые СУБД не поддерживают CASCADE UPDATE, в частности Oracle .

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

Если вам абсолютно необходимо обновить первичный ключ с помощью таблицы потомков, см. этот пост Тома Кайта (Tom Kyte) для решения .

10 голосов
/ 01 октября 2010

Атрибуты первичного ключа могут быть обновлены так же, как и любые другие атрибуты таблицы.Стабильность часто является желательным свойством ключа, но определенно не является абсолютным требованием.Если с точки зрения бизнеса имеет смысл обновить ключ, то нет фундаментальной причины, по которой вам не следует этого делать.

6 голосов
/ 01 октября 2010

Вы можете, пока

  • Значение уникально
  • Существующие внешние ключи не нарушены
2 голосов
/ 11 ноября 2014

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

2 голосов
/ 01 октября 2010

Краткий ответ: да, вы можете.Конечно, вы должны убедиться, что новое значение не соответствует ни одному существующему значению, а другие ограничения соблюдены (дух).

Что именно вы пытаетесь сделать?

1 голос
/ 01 октября 2010

Вы можете, при определенных обстоятельствах.

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

Томас

...