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 :

Les clés étrangères en mysql


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Informaticien
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Togo

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Les clés étrangères en mysql
    Bonjour. Je suis en train de créer un e base de données mais j'ai des problèmes avec des clés étrangères. Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE DATABASE gest_note;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE options(
        num_opt INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        lib_opt VARCHAR(200) NOT NULL
    ) TYPE=INNODB;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE annee_etude(
        num_annee SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        lib_annee VARCHAR(200) NOT NULL
    ) TYPE=INNODB;
    #TABLE CONCERNER#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE concerner(
        num_opt INT UNSIGNED,
        num_annee INT UNSIGNED NOT NULL,
        PRIMARY KEY(num_opt, num_annee),
        index(num_annee),
        index(num_opt),
        FOREIGN KEY(num_opt) REFERENCES options(num_opt),
        FOREIGN KEY(num_annee) REFERENCES annee_etude(num_annee)
    )TYPE=INNODB;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE semestre(
        numsem INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        lib_sem VARCHAR(200) NOT NULL
    ) TYPE=INNODB;
    #TABLE MODULES#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE modules(
        num_mod INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        lib_mod VARCHAR(200) NOT NULL,
        num_annee INT UNSIGNED NOT NULL,
        num_opt INT UNSIGNED, 
        num_sem INT UNSIGNED NOT NULL, 
        index(num_annee),
        index(num_opt),
        index(num_sem),
        FOREIGN KEY(num_annee) REFERENCES annee_etude(num_annee),
        FOREIGN KEY(num_opt) REFERENCES options(num_opt),
        FOREIGN KEY(num_sem) REFERENCES semestre(num_sem)
    ) TYPE=INNODB;
    #TABLE UNITE_ENSEIGN#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE unite_enseig(
        num_ue INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        lib_ue VARCHAR(200) NOT NULL,
        num_mod INT UNSIGNED NOT NULL,
        index(num_mod),
        FOREIGN KEY(num_mod) REFERENCES modules(num_mod)
    ) TYPE=INNODB;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE etudiant(
        num_etud INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        nom VARCHAR(200) NOT NULL,
        prenoms VARCHAR(200) NOT NULL
    ) TYPE=INNODB;
    #TABLE AVOIR#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE avoir(
        num_etud INT UNSIGNED NOT NULL,
        num_ue INT UNSIGNED NOT NULL,
        note DECIMAL(4,2)
        PRIMARY KEY(num_etud,num_ue),
        index(num_etud),
        index(num_ue),
        FOREIGN KEY(num_etud) REFERENCES etudiant(num_etud),
        FOREIGN KEY(num_ue) REFERENCES unite_enseig(num_ue)
    ) TYPE=INNODB;
    Est-ce quelqu'un pourrait m'aider a corriger ce code; en fait l'erreur se trouve au niveau des tables
    Fichiers attachés Fichiers attachés

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Pour pouvoir créer des clés étrangères, il faut que les colonnes correspondantes soient de même type.
    Par exemple, dans la table annee_etude, num_annee est de type SMALLINT, alors qu'elle est de type INT dans la table concerner. Ca génère donc une erreur à la création de la table concerner.
    Il faut tout mettre en INT ou en SMALLINT (mais pas l'un d'un côté et l'autre de l'autre)...

    Pareil pour les autres clés étrangères.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Futur Membre du Club
    Profil pro
    Informaticien
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Togo

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Bonjour.Merci pour l'aide. Je l'ai tout mis en INT mais le problème subsiste. Merci

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Est-ce qu'on peut avoir les scripts des nouvelles créations, ainsi que le message d'erreur renvoyé (et sur quelle table) ?

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Futur Membre du Club
    Profil pro
    Informaticien
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Togo

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut

    Voici le nouveau script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE DATABASE gest_note;
    USE gest_note;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE options(
        num_opt INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        lib_opt VARCHAR(200) NOT NULL
    ) TYPE=INNODB;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE annee_etude(
        num_annee INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        lib_annee VARCHAR(200) NOT NULL
    ) TYPE=INNODB;
    TABLE CONCERNER
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE concerner(
        num_opt INT UNSIGNED,
        num_annee INT UNSIGNED NOT NULL,
        PRIMARY KEY(num_opt, num_annee),
        index(num_annee),
        index(num_opt),
        FOREIGN KEY(num_opt) REFERENCES options(num_opt),
        FOREIGN KEY(num_annee) REFERENCES annee_etude(num_annee)
    )TYPE=INNODB;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE semestre(
        numsem INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        lib_sem VARCHAR(200) NOT NULL
    ) TYPE=INNODB;
    TABLE MODULES
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE modules(
        num_mod INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        lib_mod VARCHAR(200) NOT NULL,
        num_annee INT UNSIGNED NOT NULL,
        num_opt INT UNSIGNED, 
        num_sem INT UNSIGNED NOT NULL, 
        index(num_annee),
        index(num_opt),
        index(num_sem),
        FOREIGN KEY(num_annee) REFERENCES annee_etude(num_annee),
        FOREIGN KEY(num_opt) REFERENCES options(num_opt),
        FOREIGN KEY(num_sem) REFERENCES semestre(num_sem)
    ) TYPE=INNODB;
    TABLE UNITE_ENSEIGN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE unite_enseig(
        num_ue INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        lib_ue VARCHAR(200) NOT NULL,
        num_mod INT UNSIGNED NOT NULL,
        index(num_mod),
        FOREIGN KEY(num_mod) REFERENCES modules(num_mod)
    ) TYPE=INNODB;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE etudiant(
        num_etud INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        nom VARCHAR(200) NOT NULL,
        prenoms VARCHAR(200) NOT NULL) TYPE=INNODB;
    TABLE AVOIR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE avoir(
        num_etud INT UNSIGNED NOT NULL,
        num_ue INT UNSIGNED NOT NULL,
        note DECIMAL(4,2)
        PRIMARY KEY(num_etud,num_ue),
        index(num_etud),
        index(num_ue),
        FOREIGN KEY(num_etud) REFERENCES etudiant(num_etud),
        FOREIGN KEY(num_ue) REFERENCES unite_enseig(num_ue)
    ) TYPE=INNODB;
    #Les clés étrangères en mysql#

    Voici les messages d'erreurs
    Query OK, 1 row affected (0.22 sec)

    Database changed
    Query OK, 0 rows affected, 1 warning (1.50 sec)

    Query OK, 0 rows affected, 1 warning (0.36 sec)

    Query OK, 0 rows affected, 1 warning (0.31 sec)

    Query OK, 0 rows affected, 1 warning (0.17 sec)

    ERROR 1005 (HY000): Can't create table 'gest_note.modules' (errno: 150)
    ERROR 1005 (HY000): Can't create table 'gest_note.unite_enseig' (errno: 150)
    Query OK, 0 rows affected, 1 warning (0.09 sec)

    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
    corresponds to your MySQL server version for the right syntax to use near '(num_
    etud,num_ue),
    index(num_etud),
    index(num_ue),
    FOREIGN KEY(num_e' at line 5
    mysql>
    Donc les tables sont donc: MODULES, UNITE_ENSIGN et enfin AVOIR

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Dans la table modules, il faut ajouter à num_opt NOT NULL.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  7. #7
    Membre du Club

    Inscrit en
    Février 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Février 2008
    Messages : 36
    Points : 45
    Points
    45
    Par défaut MySql Adminstrator
    Bonjour tous le monde,

    Juste un conseil, Il existe un outil GUI pour la création des bases de données, des tables comme vous pouvez créer des foreign key par des cliques simples.

    Télécharger MySql Aministrator sur le site www.mysql.com

    ou bien utiliser le wamp (pour windows), lamp (pour linux). La création des bases données sera plus facile et plus rapide.

  8. #8
    Futur Membre du Club
    Profil pro
    Informaticien
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Togo

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Résolu
    Je vous remercie pour vos aides.Je suis arrivé à résoudre le problème. En fait dans la table semestre j'ai un champ numsem alors que dans les tables dont les clés étrangères doivent faire référence à ce champ font référence plutôt à un champ que j'ai nommé num_sem et qui n'existe même pas.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/08/2009, 18h47
  2. Réponses: 2
    Dernier message: 15/01/2008, 07h35
  3. Problème avec les clés étrangères
    Par PoichOU dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 06/11/2007, 09h46
  4. Réponses: 2
    Dernier message: 29/07/2007, 11h48
  5. Lister toutes les clés étrangères de toutes le tables
    Par Samish dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/08/2005, 10h15

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