Quel est le but de SET NULL dans les contraintes Supprimer / Mettre à jour les clés étrangères?


15

Je suis probablement borné, mais si je crée une contrainte de clé étrangère et qu'une ligne est mise à jour ou supprimée, je perds cette connexion si la colonne de la table enfant est définie sur NULL.

Quel est le but de conserver intentionnellement ces lignes orphelines?


Je recherche des cas d'utilisation, et je ne pense pas qu'ils soient spécifiques à la base de données (peut-être faux ici)
Derek Downey

Je n'ai jamais vu de cas d'utilisation pour cela non plus ...
a_horse_with_no_name

Réponses:


13

L' set nullutilité ou non dépend de ce que vous avez choisi nullde signifier dans le contexte particulier - avec toute la confusion et l'opinion autour de l' nullOMI, l'approche raisonnable est que le DBA

  1. Choisissez (et documentez) ce que cela signifie pour chaque champ annulable
  2. Assurez-vous que cela signifie une seule chose

Avec ces règles, considérez le cas d'utilisation suivant:

  • Vous avez une «boutique» de table (par exemple des locaux individuels)
  • Vous avez une table 'détaillant' (ex: chaînes)
  • Le tableau «boutique» a un champ de recherche se référant à la clé de «détaillant»
  • Vous avez défini nullpour représenter une boutique indépendante (c'est-à-dire qui ne fait pas partie d'une chaîne)
  • Un «détaillant» ferme ses succursales au point que vous considérez ses magasins comme indépendants

Dans ce cas, un on delete set nullfait sens. Il existe d'autres façons de modéliser ces règles commerciales, mais c'est la plus simple et si elle correspond exactement aux faits qui vous intéressent dans le monde réel, je suggère que c'est parfaitement correct


De bons points avec une signification stricte de null, et avec votre exemple, il est clair pourquoi c'est une fonctionnalité.
Derek Downey

1

La plupart des cas d'utilisation auxquels je peux penser sont généralement de la forme "Eh bien, nous pourrions faire quelque chose de différent mais nous avions envie de le faire à la place".

Considérez un ownerchamp pour un bug dans un système de suivi des problèmes dans une entreprise. Si John quitte, sûrement tous ses problèmes ne devraient pas simplement être supprimés lorsque son compte est supprimé. Même alors, certaines bases de données autorisent SET DEFAULTune action (ou un déclencheur effectue la même tâche), et avoir un Nobodyemployé comme propriétaire par défaut des problèmes pourrait être une option. Ou nous pourrions avoir un disabledchamp pour John plutôt que de supprimer son enregistrement.


3
Dans ce cas, je dirais de ne pas autoriser les suppressions ( RESTRICT), si ce n'est pour aucune autre raison que de blâmer un vieil employé en cas de problème!
Derek Downey
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.