Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/09/2011, 10h26   #1
Invité de passage
 
Inscription : janvier 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 8
Points : 1
Points : 1
Par défaut Primary key, foreign key

Bonjour,

j'ai un peu de difficulté avec mysql et les foreign key.

J'ai une 4 tables dont 3 tables qui sont référencée par leur primary key dans la 4ème tables.

Ex :

table1 :
idTable1(primary key)
table1

table2 :
idTable2(primary key)
table2

table3 :
idTable3(primary key)
table3

table4:
idTable1 (foreign key)
idTable2 (foreign key)
idTable3 (foreign key)
champsTable4

J'ai essayé la contrainte idTable1 : pas problème
J'ai essayé la contrainte idTable2 : ouaiff !
J'ai essayé la contrainte idTable3 : et elle veut pas se mettre !!!

Code :
1
2
3
ALTER TABLE table4
 ADD CONSTRAINT FK_table4_table1 FOREIGN KEY (idTable1) REFERENCES
table1 (idTable1)
Bien sur que toutes mes tables sont en INNODB.

Quand j'essaye de creer un index ou unique, ca me cree pas de foreign key. Bref, quelqu'un pourrait m'éclairer sur mysql ?

Avec mssql server, j'ai jamais eu autant de problème.

Mes salutations.
cretthie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 10h31   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Citation:
J'ai essayé la contrainte idTable1 : pas problème
J'ai essayé la contrainte idTable2 : ouaiff !
J'ai essayé la contrainte idTable3 : et elle veut pas se mettre !!!

Code :
1
2
3
ALTER TABLE table4
 ADD CONSTRAINT FK_table4_table1 FOREIGN KEY (idTable1) REFERENCES
table1 (idTable1)
Tu dis que tu n'as pas eu de problème avec la clé étrangère référençant la table 1 mais c'est la requête que tu postes et qui, effectivement, semble bonne.

Est-ce que les colonnes idTable1, idTable2 et idTable3 sont indexées préalablement à la création de la clé étrangère ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 10h43   #3
Invité de passage
 
Inscription : janvier 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 8
Points : 1
Points : 1
J'ai oublié de dire que dans table4, les 3 id sont des primary key

table4:
idTable1 (foreign key)
idTable2 (foreign key)
idTable3 (foreign key)
champsTable4

Donc, oui ces champs sont indexé.

D'avance, merci pour votre aide.

Mes salutations.
cretthie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 10h51   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Citation:
J'ai oublié de dire que dans table4, les 3 id sont des primary key
Tu as donc la clé primaire suivante : (idTable1, idTable2, idTable3).

Citation:
Donc, oui ces champs sont indexé.
Insérons des données dans la table et examinons de quelle façon elles seront classées par l'index :
idTable1, idTable2, idTable3
1, 1, 1
1, 2, 2
1, 2, 3
1, 3, 1
1, 3, 4
2, 1, 2

Inutile d'aller plus loin, tu vois que seule la première colonne est réellement classée dans l'ordre, les autres ne le sont que relativement à la précédente.
Comme les trois colonnes sont des clés étrangères, il faut qu'elles soient indexées individuellement, en plus de la clé primaire composite. Ou plus exactement, comme la première colonne de la clé primaire est déjà indexée par la clé primaire, tu n'as besoin d'indexer individuellement que les deux autres colonnes.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 11h05   #5
Invité de passage
 
Inscription : janvier 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 8
Points : 1
Points : 1
Merci pour ton aide Cinephil,

Si j'ai bien compris, avant de créer mes contrainte, je dois indexer idTable2 et idTable3. Ensuite, je pourrais creer mes contrainte foreign key.

Encore merci, je vais regardé ca et si j'arrive pas, j'ajouterai un message sur ce dialogue.
cretthie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 11h49   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par cretthie Voir le message
Si j'ai bien compris, avant de créer mes contrainte, je dois indexer idTable2 et idTable3. Ensuite, je pourrais creer mes contrainte foreign key.
C'est exactement ça !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 08h59   #7
Invité de passage
 
Inscription : janvier 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 8
Points : 1
Points : 1
Bonjour,

Merci, ca marche.

Juste une dernière question.

Faut-il indexer la table en "UNIQUE" ou en "INDEX".

D'avance, merci pour vos réponse.
cretthie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 09h12   #8
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Les clefs étrangères qui constituent une clé primaire composite sont souvent clés primaires dans la table source et seulement index dans la table où elles migrent.
Si chaque composant de la clé primaire composite devait être lui-même UNIQUE, cela dérogerait aux formes normales, d'une part et rendrait impossible ce jeu de combinaisons :
Citation:
Insérons des données dans la table et examinons de quelle façon elles seront classées par l'index :
idTable1, idTable2, idTable3
1, 1, 1
1, 2, 2
1, 2, 3
1, 3, 1
1, 3, 4
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 09h37   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Pour compléter la réponse pertinente de Maljuna Kris, regarde l'article de mon blog qui traite des tables associatives. Les cas où une clé étrangère peut en plus avoir une contrainte d'unicité sont ceux avec des cardinalités 0,1 d'un côté de l'association.
Citation:
Envoyé par CinéPhil
01) A -0,1----associer----0,1- B Table associative avec le choix de la clé primaire.
03) A -0,1----associer----0,n- B Table associative dont la clé primaire référence A
04) A -0,1----associer----1,n- B Table associative dont la clé primaire référence A
Dans ces 3 cas, l'une des clés étrangères de la table associative est en même temps clé primaire toute seule. Dans le cas 01, l'autre clé étrangère a une contrainte d'unicité.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 09h57   #10
Invité de passage
 
Inscription : janvier 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 8
Points : 1
Points : 1
Par défaut RE:

Merci à vous deux.

Vos réponses sont très clair.

A Bientot.
cretthie est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h26.


 
 
 
 
Partenaires

Hébergement Web