2010-11-12 43 views
0

J'ai deux tables: Parent, qui a une clé primaire (parentID) et d'autres champs de type varchar (50) et de l'enfant qui est la suivante:suppression en cascade supprime toute table enfant

childID, primary key 
parentID, foreign key references Parent (parentID) 
otherID, foreign key to another table 
  • Si je supprime une ligne de l'enfant, pas de problème.
  • Si je supprime une ligne de Parent, j'obtiens une erreur de contrainte de clé étrangère sur Child - bon, c'est correct.

Maintenant, je modifie la relation de la clé parentID et mettez en supprimer en cascade au lieu de No Action (J'utilise le studio serveur 2008, un clic droit sur la colonne, choisissez Modifier, puis faites un clic droit sur le et puis choisissez la relation pour les tables Parent/Enfant et ouvrez la section Insertion/Mise à jour des spécifications sous Table Designer)

Si je supprime une ligne de Child, encore une fois, pas de problème. Si je supprime une ligne de Parent, toutes les lignes de la table enfant sont supprimées, même si la plupart d'entre elles pointent vers d'autres parentID.

J'ai hérité de cette base de données et de toutes ses tables. Y a-t-il des paramètres de propriétés qui me manquent? D'après ce que j'ai lu, la suppression en cascade ne devrait supprimer que les lignes enfants qui pointent vers le parent unique que j'ai supprimé de Parent.

Merci.

Ben

+0

Oui, la suppression en cascade supprimera uniquement les lignes enfants associées au parent. Ma meilleure estimation est que vous n'avez pas défini la cascade delete right. Vérifiez à nouveau. – pavanred

Répondre

2

droit, la suppression ne doit supprimer des lignes liées à la suppression "parent".

Jetez un coup d'œil à la configuration de suppression en cascade, et recherchez également les déclencheurs qui peuvent être écrits de manière incorrecte.

+0

Excellent point sur les déclencheurs. Et personnellement, je ne suis pas favorable à l'utilisation de cascade delete. – HLGEM

+0

C'était tout, merci! Il y avait une fonction de déclenchement qui, par elle-même, ne faisait rien, mais en conjonction avec la suppression en cascade nettoyait la table. – Ben

+0

@ben: NP. @HLGEM: Je suis d'accord - les suppressions en cascade sont (généralement) une mauvaise idée. Je pense qu'il y a des cas où ils ne fonctionnent pas aussi bien. –

1

Essayez de définir SetNull au lieu de cascade, ce qui entraîne la définition de votre colonne de table enfant (où la sortie de la table parent) à NULL.