Какова цель SET NULL в ограничениях удаления / обновления внешних ключей?


15

Я, вероятно, ограничен, но если я создаю ограничение внешнего ключа и строка обновляется или удаляется, я теряю это соединение, если столбцу дочерней таблицы задано значение NULL.

Какова цель намеренного сохранения этих осиротевших строк?


Я ищу варианты использования, и я не думаю, что они специфичны для базы данных (здесь может быть неправильно)
Дерек Дауни,

Я никогда не видел
варианта

Ответы:


13

Является ли set nullэто полезным или нет, зависит от того, что вы выбрали nullдля конкретного контекста - при всей путанице и мнении вокруг nullIMO разумный подход заключается в том, чтобы администратор базы данных

  1. Выберите (и задокументируйте), что это означает для каждого пустого поля
  2. Убедитесь , что это означает , что одна только вещь

С этими правилами рассмотрим следующий вариант использования:

  • У вас есть стол «магазин» (например, отдельные помещения)
  • У вас есть таблица «ритейлер» (например, цепочки)
  • Таблица «магазин» имеет поле поиска со ссылкой на ключ «розничный продавец»
  • Определенно nullпредставлять самостоятельный магазин (то есть тот , который не является частью цепи)
  • «Ритейлер» закрывает филиалы до такой степени, что вы считаете их магазины независимыми

В этом случае on delete set nullимеет смысл. Существуют и другие способы моделирования этих бизнес-правил, но это самый простой способ, и если он точно соответствует фактам, которые вас интересуют в реальном мире, я полагаю, что это совершенно нормально.


Хорошие моменты со строгим значением ноль, и на вашем примере понятно, почему это особенность.
Дерек Дауни

1

Большинство сценариев использования, о которых я могу думать, обычно имеют форму «Ну, мы могли бы сделать что-то другое, но вместо этого нам хотелось сделать это».

Рассмотрим ownerполе для ошибки в системе отслеживания проблем в компании. Если Джон выходит, конечно, все его проблемы не должны быть просто удалены при удалении его учетной записи. Даже в этом случае некоторые базы данных допускают SET DEFAULTкак действие (или наличие триггера для выполнения той же задачи), и Nobodyможет быть вариант , если сотрудник является владельцем проблем по умолчанию. Или мы могли бы иметь disabledполе для Джона, а не удалять его запись.


3
В этом случае я бы поспорил не разрешать delete ( RESTRICT), если бы ни по какой другой причине он не указывал вину на старого сотрудника, когда с ним что-то не так!
Дерек Дауни
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.