2009-09-04 7 views
9

J'ai trois tables qui ressemblent à ceci: Comment supprimer en cascade sur la table plusieurs à plusieurs

Sur les clés étrangères, je l'ai mis en cascade supprime. À l'heure actuelle, lorsque je supprime un enregistrement dans la table des dossiers, seul l'enregistrement associé dans FolderItem est supprimé.

Ceci est attendu et correct. Ce que je voudrais accomplir est quand je supprime un enregistrement dans la table de dossier, les enregistrements correspondants dans le FolderItem et la table d'élément devraient être supprimés.

Comment résoudre ce problème? En ajoutant un déclencheur qui supprime toutes les instances de Item avec le FolderID en question? Ou y a-t-il une meilleure solution?

Répondre

10

Vous devez décider quel comportement vous voulez exactement avec le système. Votre exigence semble un peu anormale et pourrait indiquer une erreur dans la conception du schéma db. Pourquoi voulez-vous supprimer un élément lorsqu'un dossier associé est supprimé? Que se passe-t-il s'il existe encore un autre dossier lié à cet élément, puisqu'il s'agit d'une relation plusieurs-à-plusieurs? Dans ce cas, la suppression de l'élément provoquera une violation de clé étrangère entre Item et FolderItem. Si les éléments appartiennent réellement à un dossier spécifique, alias relation un à plusieurs, vous n'aurez pas du tout besoin de la table FolderItem.

Je suppose que le cas le plus probable est que vous voulez supprimer l'élément s'il n'y a pas d'autres entrées FolderItem liées à celui-ci. Dans ce cas, le déclencheur est la solution appropriée, mais vous devez vous assurer que vous le vérifiez dans la logique de déclenchement.

+0

Oui, vous avez raison, c'est un peu anormal. Et j'aurais dû clarifier le comportement recherché, ce que vous avez expliqué dans votre deuxième paragraphe. –

1

Votre FK entre l'élément de dossier et l'élément doit également avoir des suppressions en cascade activées.

MISE À JOUR:
J'ai lu votre commentaire, et la réponse alternative. Absolument, je n'aurais pas pu lire correctement votre question. En supposant des relations un-plusieurs simples, j'aurais raison, mais avec beaucoup-beaucoup ce n'est pas si simple. Les déclencheurs (ou mieux encore, une certaine logique métier dans votre code) sont votre meilleur pari pour réaliser ce que vous voulez.

+0

Il a déjà cela. Mais cela ne cascade pas supprimer l'élément en question. Voir la réponse de hongilangs. –

-1

Il ne peut pas supprimer l'enregistrement folteritem car si vous avez une relation m-to-m, il est supposé que le folderitem peut aussi être lié à un autre cours. donc, si vous supprimez sur l'enregistrement de dossier, seulement la relation devrait être supprimée, pas les dossiers connexes. Si tous les dossiers ne peuvent être associés qu'à un seul dossier, vous devez utiliser la relation un-à-plusieurs et définir la cascade dans le dossier fk (fk -> pk dans le dossier).

Questions connexes