2010-12-02 3 views
1

J'ai un parent avec beaucoup d'enfants, ce qui est bien. Contre chaque parent j'essaye de stocker un default_child. Je veux rendre le default_child obligatoire mais je ne peux pas penser comment faire ceci. La création du parent en premier signifierait la violation de la condition default_child obligatoire. Créer l'enfant en premier signifierait violer sa condition FK.Relation parent/enfant dans la base de données

Comment les autres s'en occupent-ils? Merci!

Répondre

2

Les contraintes peuvent généralement être marquées "reportable", ce qui signifie que vous pouvez demander à la base de données de différer leur vérification jusqu'à l'heure de validation. Cela vous permet de résoudre des situations comme celle-ci où une contrainte doit être violée temporairement pendant la construction de la transaction, mais sera à nouveau satisfaite au moment où vous êtes prêt à valider.

+0

Merci Wyzard. Juste vérifié le manuel de MySQL et n'a vu aucune référence à reportable. Une idée si elle est supportée par MySQL? –

+0

Kim, tu as raison, il semble que MySQL ne supporte pas les contraintes de report. – Wyzard

0

Les parents doivent exister avant d'avoir des enfants. Vrai dans la vie; vrai dans les bases de données.

Si vous souhaitez vous assurer que chaque élément que vous insérez dans la table reçoit un enfant par défaut, utilisez un déclencheur qui s'exécute immédiatement après l'insertion de l'enregistrement parent. Attention cependant, si vos enregistrements parent et enfant sont dans la même table, chaque fois que vous insérez un enfant, le déclencheur se déclenche à nouveau, créant ainsi un enfant de cet enfant; ce qui déclenchera l'insertion d'un enfant de l'enfant de l'enfant ...

+0

"Les parents doivent exister avant d'avoir des enfants." Pas exactement vrai en termes de base de données. En principe, une contrainte de clé étrangère signifie seulement qu'il n'y a pas de ligne enfant * sans * un parent correspondant. En d'autres termes, ils doivent exister * simultanément *, pas nécessairement l'un avant l'autre. Malheureusement, SQL ne peut pas supporter cela et exige en fait les lignes parents en premier. Cela peut sembler un détail mineur, mais en fait le support d'intergrité référentielle de SQL est sérieusement affaibli à cause de cette simple limitation. – sqlvogel

0

Je ne sais pas si chaque SGBD le fait, mais je m'attendrais à ce que je puisse casser les invariants à l'intérieur d'une transaction et que ce soit juste au point de validation.

0

C'est une limitation fondamentale de SQL qu'il ne peut pas supporter. Le plus proche que vous pouvez obtenir est de désactiver une ou plusieurs des contraintes temporairement - par exemple en utilisant une contrainte reportable.

Un compromis possible consiste à supprimer la colonne de référence dans sa propre table afin qu'elle fasse référence à vos deux tables actuelles. Ensuite, vous insérez seulement une ligne dans cette nouvelle table après que les autres aient été remplies. La contrainte serait toujours facultative bien sûr - c'est juste que vous n'auriez pas besoin d'une colonne nullable pour l'implémenter.

Questions connexes