Deux clés étrangères référence à une table SUR la mise à JOUR de SET NULL ne fonctionne pas
J'en ai deux clés étrangères dans la table. Supposons que le tableau est appelé News
et a les clés étrangères updatedById
et createdById
, qui pointe à userId
dans le tableau Users
.
Maintenant je veux mettre à NULL
clés étrangères lorsqu'un utilisateur est supprimé, mais lorsque je tente de régler ON DELETE SET NULL
dans les relations j'obtiens:
L'introduction de la contrainte de CLÉ ÉTRANGÈRE 'FK_News_Users' sur la table 'News' peut
cause de cycles ou de plusieurs en cascade des chemins. Spécifier on DELETE NO ACTION ou
On UPDATE NO ACTION, ou modifier d'autres contraintes de CLÉS ÉTRANGÈRES.
Je ne comprends pas pourquoi les deux clés étrangères ne pouvez pas définir la valeur null?
- Pouvez-vous poster le complet SQL DDL pour la table "News" et les "Utilisateurs"?
- Aussi la marque de la question avec le sgbd que vous utilisez. (SQL Server, Oracle, MySQL, PostgreSQL, etc.)
- exemple de base de données: dl.dropbox.com/u/105509493/test.sql essayez de modifier la relation: FK_News_Users_updated - SUR SUPPRIMER pour Définir la valeur Null et économisez. Vous verrez que l'erreur.
- Vous êtes donc en permettant aux orphelins News dossiers d'exister sans les propriétaires? Cela fait-il sens?
- S'il vous plaît ne pas envisager d'en comprendre le sens, mais le problème. Ce tableau ne sont pas mes vraies tables, j'ai créé cet échantillon afin de simplifier le problème. Btw. cet exemple a un sens, parce que l'utilisateur peut être supprimé, mais la nouvelle doit le rester.
- Normalement dans des situations de ce genre vous préférez supprimer l'utilisateur logiquement physiquement par l'introduction d'un indicateur (par exemple, Active ou Supprimés). De cette façon, toutes les relations rester intacte et peut être analysé de façon rétrospective.
- très bonne idée, j'ai pensé aussi à ce sujet...
Vous devez vous connecter pour publier un commentaire.
Plusieurs des Actions en Cascade
Éventuellement dans des situations comme cela, vous pourriez envisager de mettre en œuvre la fonctionnalité de suppression d'un utilisateur logiquement plutôt que physiquement (par exemple, par l'introduction d'un indicateur Active ou Supprimé dans
Users
tableau). De cette façon, toutes les relations rester intacte et peut être analysé de façon rétrospective.Mais si vous avez encore besoin de mettre en œuvre
ON DELETE SET NULL
pour les deux FK vous pouvez utiliser unFOR DELETE
déclencheur surUser
tableau comme ceci:ON DELETE SET NULL
etON DELETE CASCADE
existent pour une raison.on delete set null
, la suppression de l'information est exactement de l'action le concepteur de base de données, il a été décidé approprié. C'est pourquoi les deuxon delete set null
eton delete cascade
existent--pour supprimer l'information--et pourquoi ils ont fait partie de la norme SQL depuis 1992. (Et ce ne sont pas les OP de vraies tables. La question n'est pas de savoir sion delete set null
est approprié. La question est de savoir pourquoi il ne parvient pas, dans ces circonstances, dans SQL Server.)Une alternative est de créer une table de concordance entre les tables A et B, où chaque entrée est A. ID et B. ID et B. ID est une clé étrangère vers B. Ensuite, vous pouvez simplement les suppressions en CASCADE à la référence croisée. Vous aurez besoin de mettre un troisième champ dans votre renvoi à l'etat le but unique de référence tels que
Naturellement, vous devez ensuite prendre ces champs de la table A. La jointure gauche vous donnera alors la valeur null pour ces champs si ils sont absents.
Je ne pense pas que c'est possible (SQL Server) afin de le faire sur 2 ou plusieurs contraintes FK sur la même table, pointant vers la même FK.
Si vous voulez coller avec l'idée originale de paramètre NULL, une façon de contourner le problème serait de gérer votre suppression d'utilisateurs dans une procédure stockée et faire effectuer les mises à jour immédiatement après.