IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Primary key, foreign key


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 16 814
    Billets dans le blog
    14
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    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.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 16 814
    Billets dans le blog
    14
    Par défaut
    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).

    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 Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    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.

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 16 814
    Billets dans le blog
    14
    Par défaut
    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 Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    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.

  8. #8
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    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 :
    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)

  9. #9
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 16 814
    Billets dans le blog
    14
    Par défaut
    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 Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  10. #10
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut RE:
    Merci à vous deux.

    Vos réponses sont très clair.

    A Bientot.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 31/12/2010, 12h08
  2. Primary Key et Foreign Key dans la même Entity
    Par Invité dans le forum JPA
    Réponses: 1
    Dernier message: 08/07/2008, 10h46
  3. PRIMARY KEY et FOREIGN KEY sur la même colonne ?
    Par SpecialCharacter dans le forum Outils
    Réponses: 4
    Dernier message: 31/01/2008, 17h35
  4. Foreign Key sur une partie de Primary Key
    Par Loceka dans le forum Langage SQL
    Réponses: 3
    Dernier message: 03/10/2006, 09h09
  5. [Exemple]Mieux comprendre Primary/Foreign Key - Cardinalités
    Par tarzanchita dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 07/04/2006, 08h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo