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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

Ответ 3

Вы можете до тех пор, пока

  • Значение уникально
  • Нарушены существующие внешние ключи.

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Томас