2010-06-18 9 views
0

Bonjour les amis, je reçois l'erreur suivante tout en rendant la clé étrangèreErreur de SQL Server

« tbl_course » table sauvé avec succès Table « tbl_students » - Impossible de créer la relation « FK_tbl_students_tbl_course ».
Présentation de la contrainte FOREIGN KEY 'FK_tbl_students_tbl_course' sur la table 'tbl_students' peut provoquer des cycles ou plusieurs chemins en cascade. Spécifiez ON SUPPRIMER AUCUNE ACTION ou SUR ACTUALISER NO ACTION, ou modifier d'autres contraintes KEY FOREIGN. Impossible de créer la contrainte . Voir les erreurs précédentes.

je les tableaux ci-dessous College, table Branch, Course table et Student Table

Course a une college_id clé étrangère, Branch a une clé étrangère course_id et je veux faire college_id, course_id, branch_id comme clés étrangères à ma table Student mais tout en faisant course_id et branch_id comme clé étrangère dans le tableau Student générer l'erreur mentionnée ci-dessus ... s'il vous plaît il me lp pour résoudre le problème ci-dessus ..... merci

+3

Vous devez afficher la phrase que vous utilisez pour créer votre table: "create table tbl_course ...". Sinon, il est simplement impossible de vous aider. –

+4

Saint flux de la conscience - vous devez utiliser un peu de ponctuation, et un exemple ou deux. –

Répondre

2

Selon MS

Vous recevez ce message d'erreur, car dans SQL Server, une table ne peut pas apparaître plus d'une fois dans une liste de tous les actions référentielles en cascade démarrées par une instruction DELETE ou UPDATE. Par exemple, l'arbre des actions référentielles en cascade ne doit avoir qu'un seul chemin vers une table particulière dans l'arbre des actions référentielles en cascade.

http://support.microsoft.com/kb/321843

Pouvez-vous vivre sans la mise en cascade supprime? Gardez l'ingégrité référentielle mais pas les actions référencielles (cascades). Vous pouvez recourir à un déclencheur comme un travail autour si nécessaire.

EDIT:

CREATE TRIGGER [dbo].[tr_College_Delete] ON [dbo].[College] 
FOR DELETE 
AS 
BEGIN 
    DELETE FROM student 
    where collegeid in (select collegeid from deleted) 

END 

pas testé.

+0

oui si je ne mets pas en cascade puis ça marche, mais ça ne sert à rien sans cela .... – NoviceToDotNet

+2

Eh bien, je crains que le serveur sql ne vous laisse pas. Vous pouvez utiliser un déclencheur si vous avez vraiment besoin de la fonctionnalité en cascade au niveau de la base de données. – Gratzy

+0

Gratter ..trigger m'a effrayé..je n'ai jamais utilisé ce peut me suggérer comment l'utiliser pour se débarrasser de ce problème ... – NoviceToDotNet

1

Pourquoi ajouteriez-vous autre chose que branch_id à l'étudiant? De là, vous devriez être en mesure de déterminer à quel cours appartient la branche et à quel collège appartient le cours.

Si vous avez

College 
College1 
College2 
College3 

Course 
Course1, College1 
Course2, College1 
Course3, College2 

Branch 
Branch1, Course1 
Branch2, Course1 
Branch3, Course2 

Student 
Student1,College3,Course3,Branch1 

Ceci est valable du point de vue de la base de données, mais n'a pas de sens puisque le dossier de l'élève doit être attaché à Collégial1 en fonction de la Direction générale auquel il est attaché. Vous savez logiquement que si l'étudiant est dans une branche avec ID Branch1 (ou quelle que soit la clé primaire que vous utilisez, mais je l'utilise à des fins d'illustraion), alors il doit être dans Course1 et College1. En ajoutant les informations supplémentaires à l'enregistrement étudiant, vous créez non seulement des références circulaires dans le code, mais vous vous mettez dans une position pour créer un enregistrement "corrompu" dans la base de données.Bien sûr, vous pouvez coder autour de ceci, mais pourquoi aller à l'effort supplémentaire quand vous pouvez simplifier le dossier de l'étudiant à simplement (Student1, Branch1) sans perdre aucune donnée?

Ceci est connu sous le nom database normalization, et c'est quelque chose de très important à considérer au moins lorsque vous construisez un modèle de données.

+0

Kendrick ... student table a des informations sur l'étudiant qui contient student_id comme clé primaire, il a aussi colleg_id branch_id et course_id .... je veux si collge_id est supprimé alors tout corrosponding dossier à ce collège de la table des étudiants doit être supprimé même pour les cours et la branche ... – NoviceToDotNet

+1

Si vous avez des étudiants qui ont suivi des cours dans une branche particulière, vous ne voulez certainement pas supprimer le collège, vous voulez le marquer comme inactif ou vous perdrez votre historique et je serais très en colère contre vous si je suivais un cours à la branche A et que ce n'était pas dans ma transcription et que je ne pouvais pas obtenir mon diplôme parce que vous avez supprimé ma participation à la session . – HLGEM

+0

commentaire suite Cela revient à supprimer la pièce d'une commande qui a été remplie dans le passé lorsque la pièce n'est plus disponible à l'achat. Il était encore acheté dans le passé. L'utilisation de suppressions en cascade (ou d'un déclencheur) pour une fonctionnalité comme celle-ci est dangereuse. Vous détruisez complètement l'intégrité de vos données. Les enregistrements historiques ne doivent jamais être supprimés si l'entité qu'ils utilisent n'est plus en existence. – HLGEM

Questions connexes