Meilleur auteur de réponses
Problème de création d'une clé étrangère qui est déjà clé primaire dans une autre table

Question
-
Bonjour
Voila ma base de donnes:
create table Employe
(
NumEmploye int identity,
NomEmploye varchar(20),
PrenomEmploye varchar(20),
SexeEmploye char(1),
DNaissEmploye datetime,
FonctionEmploye varchar(30),
constraint PK_Employe_NumEmploye primary key (NumEmploye)
)
create table Inscription
(
NumEmploye int,
CodeProjet varchar(10),
DateInscription datetime,
constraint FK_Inscription_CodeProjet foreign key (CodeProjet) references Projet(CodeProjet),
constraint FK_Inscription_NumEmploye foreign key (NumEmploye) references Employe(NumEmploye),
constraint PK_Inscription_NumEmploye_CodeProjet primary key (NumEmploye, CodeProjet)
)
create table Projet
(
CodeProjet varchar(10),
Typeproj varchar(20),
DateDebut datetime,
DateFin datetime,
constraint FK_Projet_TypeProjet foreign key (TypeProj) references TypeProjet(TypeProj),
constraint PK_Projet_CodeProjet primary key (CodeProjet, Typeproj)
)
create table TypeProjet
(
Typeproj varchar(20),
LibelleProjet varchar(50),
DureeProjet int,
constraint PK_TypeProjet_TypeProj primary key (TypeProj)
)Le problème c'est quand je veux exécuter la table Inscription je reçois ce message " Il n'y a pas de clés primaires ou d'un candidat à la table référencée 'Projet' qui correspondent à la liste des colonnes de référencement dans la clé étrangère 'FK_Inscription_CodeProjet"
Je sais vraiment pas d’où viens le problème et merci d'avance
Réponses
-
Bonjour,
si tu exécutes ce script tel quel c'est normal que tu ais une erreur étant donné qu'au moment de la création de ta contrainte de clé étrangère, la table projet n'existe pas.
Pour mettre en place cette base tu dois créer tes tables dans l'ordre suivant : Employe, TypeProjet, Projet, Inscription.
- Proposé comme réponse Ciprian Duduiala jeudi 8 mars 2012 16:10
- Marqué comme réponse Ciprian Duduiala mardi 13 mars 2012 06:56
-
Bonjour,
La clé primaire de la table Projet est composée par 2 champs. Quand vous créez votre FK il faut soit utiliser tous les champs de la clé primaire, soit s’assurer que le champ de la clé est unique.
En plus, Fabien a raison : il faut aussi respecter l’ordre de création de vos tables.
Essayez avec :
create table Employe ( NumEmploye int identity, NomEmploye varchar(20), PrenomEmploye varchar(20), SexeEmploye char(1), DNaissEmploye datetime, FonctionEmploye varchar(30), constraint PK_Employe_NumEmploye primary key (NumEmploye) ) create table TypeProjet ( Typeproj varchar(20), LibelleProjet varchar(50), DureeProjet int, constraint PK_TypeProjet_TypeProj primary key (TypeProj) ) create table Projet ( CodeProjet varchar(10) UNIQUE, Typeproj varchar(20), DateDebut datetime, DateFin datetime, constraint FK_Projet_TypeProjet foreign key (TypeProj) references TypeProjet(TypeProj), constraint PK_Projet_CodeProjet primary key (CodeProjet, Typeproj) ) create table Inscription ( NumEmploye int, CodeProjet varchar(10), DateInscription datetime, constraint FK_Inscription_CodeProjet foreign key (CodeProjet) references Projet(CodeProjet), constraint FK_Inscription_NumEmploye foreign key (NumEmploye) references Employe(NumEmploye), constraint PK_Inscription_NumEmploye_CodeProjet primary key (NumEmploye, CodeProjet) )
Bonne journée,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
- Marqué comme réponse Ciprian Duduiala mardi 13 mars 2012 06:56
-
Bonjour,
La fk "CodeProjet" référence "CodeProjet" dans Projet qui n'est ni une clé primaire (la clé primaire dans projet est CodeProjet,TypeProj) ni une clé candidate d'où le message (on ferait un fk entre une ligne et potentiellement plusieurs lignes de la table parent).
Est-il possible d'avoir plusieurs fois le même CodeProjet pour des TypProjet différent ? Si oui, la colonne TypProjet devrait appaitre également dans les tables enfant. Une autre approche est d'affecter un id interne (numéro automatique) à chaque projet et de mettre un index unique sur CodeProjet,TypProjet. Les fk utilisent ce n° interne (ce qui peut être pratique si les utilisateurs sont autorisés à changer CodeProjet ou TypProjet).
Si non, alors la pk dans Projet devrait être seulement sur la colonne CodeProjet.
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
- Marqué comme réponse Ciprian Duduiala mardi 13 mars 2012 06:56
Toutes les réponses
-
Bonjour,
si tu exécutes ce script tel quel c'est normal que tu ais une erreur étant donné qu'au moment de la création de ta contrainte de clé étrangère, la table projet n'existe pas.
Pour mettre en place cette base tu dois créer tes tables dans l'ordre suivant : Employe, TypeProjet, Projet, Inscription.
- Proposé comme réponse Ciprian Duduiala jeudi 8 mars 2012 16:10
- Marqué comme réponse Ciprian Duduiala mardi 13 mars 2012 06:56
-
Bonjour,
si tu exécutes ce script tel quel c'est normal que tu ais une erreur étant donné qu'au moment de la création de ta contrainte de clé étrangère, la table projet n'existe pas.
Pour mettre en place cette base tu dois créer tes tables dans l'ordre suivant : Employe, TypeProjet, Projet, Inscription.
Merci Fabien,
Avant de poser cette question, j'ai déjà exécuter la base de donnée table par table dans l'ordre que tu viens de citer :( Je sais vraiment pas pourquoi ça marche pas
Strix
-
Bonjour,
La clé primaire de la table Projet est composée par 2 champs. Quand vous créez votre FK il faut soit utiliser tous les champs de la clé primaire, soit s’assurer que le champ de la clé est unique.
En plus, Fabien a raison : il faut aussi respecter l’ordre de création de vos tables.
Essayez avec :
create table Employe ( NumEmploye int identity, NomEmploye varchar(20), PrenomEmploye varchar(20), SexeEmploye char(1), DNaissEmploye datetime, FonctionEmploye varchar(30), constraint PK_Employe_NumEmploye primary key (NumEmploye) ) create table TypeProjet ( Typeproj varchar(20), LibelleProjet varchar(50), DureeProjet int, constraint PK_TypeProjet_TypeProj primary key (TypeProj) ) create table Projet ( CodeProjet varchar(10) UNIQUE, Typeproj varchar(20), DateDebut datetime, DateFin datetime, constraint FK_Projet_TypeProjet foreign key (TypeProj) references TypeProjet(TypeProj), constraint PK_Projet_CodeProjet primary key (CodeProjet, Typeproj) ) create table Inscription ( NumEmploye int, CodeProjet varchar(10), DateInscription datetime, constraint FK_Inscription_CodeProjet foreign key (CodeProjet) references Projet(CodeProjet), constraint FK_Inscription_NumEmploye foreign key (NumEmploye) references Employe(NumEmploye), constraint PK_Inscription_NumEmploye_CodeProjet primary key (NumEmploye, CodeProjet) )
Bonne journée,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
- Marqué comme réponse Ciprian Duduiala mardi 13 mars 2012 06:56
-
Bonjour,
La fk "CodeProjet" référence "CodeProjet" dans Projet qui n'est ni une clé primaire (la clé primaire dans projet est CodeProjet,TypeProj) ni une clé candidate d'où le message (on ferait un fk entre une ligne et potentiellement plusieurs lignes de la table parent).
Est-il possible d'avoir plusieurs fois le même CodeProjet pour des TypProjet différent ? Si oui, la colonne TypProjet devrait appaitre également dans les tables enfant. Une autre approche est d'affecter un id interne (numéro automatique) à chaque projet et de mettre un index unique sur CodeProjet,TypProjet. Les fk utilisent ce n° interne (ce qui peut être pratique si les utilisateurs sont autorisés à changer CodeProjet ou TypProjet).
Si non, alors la pk dans Projet devrait être seulement sur la colonne CodeProjet.
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
- Marqué comme réponse Ciprian Duduiala mardi 13 mars 2012 06:56