Можем ли мы обновить значения первичных ключей таблицы?
Можем ли мы обновить значения первичных ключей таблицы?
Ответ 1
Общепризнано, что первичные ключи должны быть неизменными (или как можно более стабильными, поскольку неизменность может не выполняются в БД). Хотя нет ничего, что помешает вам обновить первичный ключ (кроме ограничения целостности), это может быть не очень хорошая идея:
С точки зрения производительности:
- Вам нужно будет обновить все внешние ключи, которые ссылаются на обновленный ключ. Одно обновление может привести к обновлению потенциально большого количества таблиц/строк.
- Если внешние ключи не проиндексированы (!), вам необходимо будет поддерживать блокировку в таблице children, чтобы обеспечить целостность. Oracle будет удерживать блокировку на короткое время, но все же, это страшно.
- Если ваши внешние ключи индексируются (как и должно быть), обновление приведет к обновлению индекса (delete + insert в структуре индекса), это, как правило, более дорого, чем фактическое обновление базовой таблицы.
- В таблицах ORGANIZATION INDEX (в других СУБД см. кластерный первичный ключ) строки физически сортируются по первичному ключу. Логическое обновление приведет к физической удаленной + вставке (более дорогостоящей)
Другие соображения:
- Если этот ключ указан в любой внешней системе (кэш приложений, другой БД, экспорт...), ссылка будет прервана при обновлении.
- Дополнительно, некоторые СУБД не поддерживают CASCADE UPDATE, в частности Oracle.
В заключение, во время проектирования, как правило, безопаснее использовать суррогатный ключ вместо естественного первичного ключа, который, как предполагается, не изменяется, но в конечном итоге его необходимо обновить из-за измененных требований или даже ошибки ввода данных.
Если вам абсолютно необходимо обновить первичный ключ с помощью таблицы children, см. этот пост от Tom Kyte для решения.
Ответ 2
Атрибуты первичного ключа так же обновляются, как и любые другие атрибуты таблицы. Стабильность часто является желательным свойством ключа, но определенно не является абсолютным требованием. Если имеет смысл с точки зрения бизнеса обновить ключ, тогда нет основополагающих причин, почему вы не должны.
Ответ 3
Вы можете до тех пор, пока
- Значение уникально
- Нарушены существующие внешние ключи.
Ответ 4
Короткий ответ: да, вы можете. Конечно, вам нужно убедиться, что новое значение не соответствует ни одному существующему значению, а другие ограничения выполнены (duh).
Что именно вы пытаетесь сделать?
Ответ 5
С точки зрения теории реляционных баз данных, нет необходимости в обновлении первичного ключа таблицы при условии, что между первичными ключами нет дубликатов и что вы не пытаетесь поместить значение NULL в любой столбцов первичного ключа.
Ответ 6
Вы можете, при определенных обстоятельствах.
Но тот факт, что вы считаете это, является сильным признаком того, что в вашей архитектуре что-то не так: Первичные ключи должны быть чистыми техническими и не иметь никакого коммерческого значения. Поэтому никогда не должно быть необходимости их менять.
Томас