Яка мета SET NULL в обмеженнях видалення / оновлення зовнішніх ключів?


15

Я, мабуть, обмежено налаштований, але якщо я створюю обмеження для зовнішнього ключа, а рядок оновлюється або видаляється, я втрачаю це з'єднання, якщо стовпець дочірньої таблиці встановлюється на NULL.

Яка мета навмисного утримання цих осиротілих рядів?


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

Я ніколи не бачив для цього випадку використання ...
a_horse_with_no_name

Відповіді:


13

Є чи set nullце корисно чи ні , залежить від того, що ви вибрали nullдля позначення в певному контексті - з усією плутанини і думок навколо nullІМВ розумний підхід для АБД

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

З цими правилами врахуйте такий випадок використання:

  • У вас є столик "магазин" (наприклад, окремі приміщення)
  • У вас є таблиця "ритейлер" (наприклад, мережі)
  • У таблиці "shop" є поле пошуку, що посилається на ключ "роздрібної торгівлі"
  • Ви визначили, nullщо представляє незалежний магазин (тобто той, який не є частиною мережі)
  • "Роздрібний продавець" закриває відділення до того, що ви вважаєте, що його магазини є незалежними

У цьому випадку on delete set nullмає сенс. Є й інші способи моделювання цих правил бізнесу, але це найпростіший, і якщо він точно відповідає фактам, які вас цікавлять у реальному світі, я пропоную це абсолютно нормально


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

1

Більшість випадків використання, які я можу вважати, мають форму "Ну, ми могли б зробити щось інше, але нам здалося, що це роблять замість цього".

Розглянемо ownerполе для помилки в системі відстеження проблем у компанії. Якщо Джон відмовляється, напевно всі його проблеми не повинні бути просто видалені, коли його обліковий запис буде видалено. Навіть тоді деякі бази даних дозволяють SET DEFAULTзробити дію (або тригером виконувати одне і те ж завдання), а можливість Nobodyпрацівника бути власником проблем за замовчуванням може бути варіантом. Або ми можемо мати disabledполе для Джона, а не видаляти його запис.


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