Je ne conçois pas tous les jours des schémas, mais j'essaie de configurer correctement les mises à jour / suppressions en cascade pour faciliter l'administration. Je comprends comment fonctionnent les cascades, mais je ne me souviens jamais de quelle table il s'agit.
Par exemple, si j'ai deux tables - Parent
et Child
- avec une clé étrangère sur Child
ces références Parent
et ce qui a ON DELETE CASCADE
, quels enregistrements déclenchent une cascade et quels enregistrements sont supprimés par la cascade? Ma première hypothèse serait que les Child
enregistrements soient supprimés quand les Parent
enregistrements sont supprimés, car les Child
enregistrements dépendent des Parent
enregistrements, mais le ON DELETE
est ambigu; cela pourrait signifier supprimer l' Parent
enregistrement lorsque l' Child
enregistrement est supprimé ou cela pourrait signifier supprimer l' Child
enregistrement lorsque le Parent
est supprimé. Alors c'est quoi?
J'aimerais que la syntaxe soit ON PARENT DELETE, CASCADE
, ON FOREIGN DELETE, CASCADE
ou quelque chose de similaire, pour lever l'ambiguïté. Quelqu'un a-t-il des mnémoniques pour s'en souvenir?
la source
Order(custID, itemID, orderID)
oùcustID
fait référence à une clé primaire dans laCustomers
table etitemID
fait référence à une clé primaire dans laItems
table. Tu n'auras pasOrder
deux parents?ON DELETE CASCADE est une clause facultative dans une déclaration de clé étrangère. Donc, cela va avec la déclaration de clé étrangère. (Signification, dans la table "enfant".)
Une façon d'interpréter une déclaration de clé étrangère est la suivante: "Toutes les valeurs valides pour cette colonne proviennent de 'that_column' dans 'that_table'." Lorsque vous supprimez une ligne dans la table "enfant", personne ne s'en soucie. Cela n'affecte pas l'intégrité des données.
Lorsque vous supprimez une ligne de la table "parent" - de "that_table" - vous supprimez une valeur valide des valeurs possibles pour la table "enfant". Pour maintenir l'intégrité des données, vous devez modifier la table "enfant". Les suppressions en cascade sont une chose que vous pouvez faire.
la source
SQL: Spéc. 2011
Il y a cinq options pour
ON DELETE
, etON UPDATE
cela peut s’appliquer àFOREIGN KEY
. Celles-ci sont appelées<referential actions>
directement à partir de la spécification SQL: 2011La clé étrangère établit la relation dépendante. Le
<referential action>
détermine ce qui se passe lorsque la relation est dissoute.Exemple / métaphore / explication
Pour cet exemple, nous accepterons le modèle commun de société et d’économie: chaque entreprise
business
est une entreprise qui entretient une relation de bout enbourgeoisie
boutfatcat_owner
.Si toutes les
business
es sont directement touchées par labourgeoisie
leur,fatcat_owner
que faites-vous après la révolution ouvrière lorsque vous la purgezfatcat_owner
et que vous avez une société sans classes?Vous avez quelques options ici,
RESTRICT
. Certaines personnes croient que c'est le moindre mal, mais ils ont généralement tort.Laissez-le continuer. Si oui, quand la révolution se produit, SQL vous donne quatre options,
SET NULL
- laissez le champ vide. Qui sait, peut-être que le capitalisme est restaurébourgeoisie
et que les oligarques remplissent les rôlesfatcat_owners
. Remarque importante, la colonne doit êtreNULLABLE
(nonNOT NULL
) ou cela ne peut jamais arriver.SET DEFAULT
- Peut-être que vous avez eu unDEFAULT
qui a géré cela? UnDEFAULT
peut appeler une fonction. Peut-être que votre schéma est déjà prêt pour la révolution.CASCADE
- il n'y a pas de contrôle des dégâts. Si lebourgeoisie
va, le fait aussibusiness
. Si une entreprise doit en avoir unfatcat_pig
, il est parfois plus logique de perdre les données plutôt que de laisser un non-entreprise dans unebusiness
table.NO ACTION
- c’est essentiellement une méthode pour retarder la vérification, cela n’est pas différent dans MySQLRESTRICT
, mais dans PostgreSQL, vous pouvez le faire.Dans un tel système, la contrainte n'est validée qu'avant la validation de la transaction. Cela peut entraîner l’arrêt de la révolution, mais vous pouvez récupérer dans la transaction, moyennant un certain degré de «récupération».
la source
referenced
- ce que table signifie table parent etreferencing
table signifie table enfant?Un simple mnémonique serait
ON DELETE du parent CASCADE [en supprimant] ici
Cela vous indique quels suppressions (suppressions du parent) sont mises en cascade, où l' instruction ON DELETE CASCADE est envoyée (sur l'enfant) et ce qui est supprimé (l'enfant).
la source
Eh bien, peut-être pouvons-nous rationaliser la syntaxe. Prenons un exemple en Python:
ce que cette ligne dit est on_delete du parent (ce qui est mentionné accidentellement dans la déclaration), veuillez transférer en cascade la suppression sur l'enfant. C’est pourquoi l’instruction CASCADE est définie au niveau de l’enfant, elle marque les enfants à supprimer.
Par exemple si vous avez eu une autre classe
cette structure indiquerait clairement lequel des enfants doit être retiré (Child) et ceux qui doivent rester (GrownUpChild), même orphelin
[Edit: Etant donné le contexte de la discussion, en particulier dans les cas de on_delete = models.CASCADE, etc.], en fait, il est souvent souhaitable de laisser les enfants d'un parent supprimé, pour des raisons d'audit et de rapport, ainsi que pour la récupération accidentelle. suppressions. [bien entendu, les logiciels de niveau entreprise seront construits autour de ce comportement et marqueront les enregistrements supprimés comme supprimés = 1 au lieu de les supprimer réellement et ne les incluront pas non plus dans les requêtes pour le serveur frontal, à l'exception de certains rapports spécialement conçus. De plus, il aura pour fonction de purger les enregistrements supprimés == 1 de la base de données, qui seront généralement exécutés par l'administrateur de l'interface utilisateur, évitant souvent toute implication de son côté.]
la source