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

Administration MySQL Discussion :

Intégration de clé étrangère


Sujet :

Administration MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Points : 16
    Points
    16
    Par défaut Intégration de clé étrangère
    Bonjour,

    Alors j'ai lu quelques post (et aussi une bonne partie du cours sur sql, mais c'est très obscure pour moi) sur la création de clés étrangères.

    Dans mon cas j'aimerai pouvoir modifier une table existante, je tente d'utiliser ALTER TABLE et je reçois une erreur 1064 (erreur de syntaxe) mais je ne vois pas ou se situe l'erreur.

    Voici ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE 'ph_construct' 
    ADD FOREIGN KEY ('id_prg') 
    REFERENCES 'ph_programme' ('id_prg')
    Je veux ajouter la clé id_prg (ligne id dans ma table ph_programme) dans la table ph_construct.
    Mon but étant de pouvoir appeler certaines informations contenue dans des tables séparées en fonction d'un nom de programme particulier.

    Par exemple pour le programme XXX, je veux la date de démarrage des travaux, les coordonnées des différents intervenants etc...
    Donc j'ai besoin de clés étrangères.

    J'ai modifié l'ensemble de mes tables pour les passer en InnoDB (moteur en MyIsam par défaut), et lancé ma requête et donc voila le message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1064 - 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 ''ph_construct' ADD FOREIGN KEY ('id_prg') REFERENCES 'ph_programme' ('id_prg')' at line 1
    Veuillez être transigeant, je tâtonne...

    Merci par avance

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    tu ne dois pas utiliser les 'apostrophes' autour des noms de tables ou de colonnes. Ils s'écrivent sans rien ou éventuellement entre `accents graves`.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE ph_construct
    ADD FOREIGN KEY (id_prg) 
    REFERENCES ph_programme (id_prg)
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Points : 16
    Points
    16
    Par défaut
    Faute de débutant, autant pour moi...

    Cependant, je reçois le message suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1072 - Key column 'prg' doesn't exist in table
    Cela veut-il dire qu'il faut que je créé un champ à la main!?
    Le "ADD" ne sert-il à rien? si je dois passer sur toutes mes tables en fonction des jonctions multiples que je dois créer ?

    Peut-être me manque-t-il un élément ?


    Merci de me répondre en tout cas.

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    ADD COLUMN ajoute une colonne à la table.
    ADD FOREIGN KEY ajoute la contrainte d'intégrité référentielle (vérification de la clef étrangère), sur une colonne qui doit effectivement exister...
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Points : 16
    Points
    16
    Par défaut
    Bonjour et merci pour la réponse,

    SI je comprends correctement, je peux faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ALTER TABLE ph_construct
    ADD id_prg INT(à ne pas oublier, sinon erreur de syntaxe)
    REFERENCES ph_programme (id_prg)
    Est-ce correcte?

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    sous réserve de test, oui.
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Points : 16
    Points
    16
    Par défaut
    OK alors,

    Dernier point; comment tester ?

    Je me heurte à un autre soucis technique (qui nécessite peut être l'ouverture d'un nouveau thread?).

    Je voudrais justement grâce à une clé étrangère lié une table à une autre et faire appel ainsi aux informations d'une table B en fonction d'une info contenue dans la table A.

    Pas claire? ok je comprends.

    Table A
    id_programme
    nom_programme

    Table B
    id_terrain
    terr_sfce


    Dans myadmin j'ai entré la syntaxe précédente (en insérant id_programme = "id_prg").
    Mais je ne vois absolument pas comment faire sur ma page en php.

    J'ai fais ca (mais j'obtiens des champs vide...):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
    	$sql1="SELECT * FROM ph_terrain WHERE id_prg='".$_POST['programme']."'";
    	$retour1 = mysql_query($sql1);
    	$donnees1 = mysql_fetch_array($retour1);
    ?>
    <?php
    	$sql2="SELECT * FROM ph_affichage WHERE id_prg='".$_POST['programme']."'";
    	$retour2 = mysql_query($sql2);
    	$donnees2 = mysql_fetch_array($retour2);
    ?>
    Plus loin dans un tableau je veux afficher l'info surface du terrain (terr_sfce) en fonction du nom du programme (via id_prg en clé étrangère,non?).

    Donc j'ai fais ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <tr>
    			<td>Superficie:</td>
    			<td><input name="prg_adr" value="<?php echo $donnees1['ter_sfce'] ?>" /></td>
    		</tr>
    Une aide? Jsuis un peu perdu.

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    Citation Envoyé par Khaos Voir le message
    OK alors,
    Dernier point; comment tester ?
    Tu lances ta requête et tu vois si MySQL l'accepte

    Je lirai ta seconde question un peu plus tard.
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par Antoun Voir le message
    Tu lances ta requête et tu vois si MySQL l'accepte
    Merci, mais c'est le lien entre les 2 tables que j'aimerai vérifier.
    Pour l'intégration de la clé via la requête, c'est bon.

  10. #10
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    Citation Envoyé par Khaos Voir le message
    Merci, mais c'est le lien entre les 2 tables que j'aimerai vérifier.
    Pour l'intégration de la clé via la requête, c'est bon.
    Je me disais aussi !

    Pour tester le fonctionnement de ta contrainte, tu tentes d'insérer dans ph_construct une ligne avec une id_prg qui n'existe pas dans ph_programme.
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Points : 16
    Points
    16
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO ph_construct (id_cst, cst_type, cst_destination, 
      cst_niv, cst_nom_archi, cst_nb_bat, cst_nb_park, cst_nb_lot,
      	cst_nb_logt, id_prg)
    VALUES ("","","","","","","","","","300")
    Ca me créé bien la valeur 300 dans la table ph_construct, mais pas dans ma table ph_programme (table d'origine de la clé étrangère)...

  12. #12
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    Donc ta clé ne marche pas, car MySQL devrait refuser l'insertion.
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Points : 16
    Points
    16
    Par défaut
    T'as une idée de la solution? Ou du problème?

  14. #14
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    Tes deux tables sont bien en InnoDB (SHOW CREATE TABLE) ?
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Points : 16
    Points
    16
    Par défaut
    Dans une étape précédente (au cours de mes lectures j'ai vu qu'il fallait passer les tables en InnoDB pour pouvoir intégrer de clés étrangères) j'ai passé chacune de mes tables en InnoDB.

    Voici le SHOW CREATE TABLE ph_construct pour exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ph_construct 	CREATE TABLE `ph_construct` (
     `id_cst` int(11) NOT NULL AUTO_INCREMENT,
     `cst_type` varchar(20) NOT NULL,
     `cst_destination` varchar(50) NOT NULL,
     `cst_niv` varchar(2) NOT NULL,
     `cst_nom_archi` varchar(50) NOT NULL,
     `cst_nb_bat` int(2) NOT NULL,
     `cst_nb_park` int(3) NOT NULL,
     `cst_nb_lot` int(11) NOT NULL,
     `cst_nb_logt` int(11) NOT NULL,
     PRIMARY KEY (`id_cst`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC
    Même résultat sur ma table ph_programme.

  16. #16
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    La colonne id_prg n'existe même pas sur ta table ! Apparemment, ta requête de création a échoué, ou alors tu n'es pas sur la même base.
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Points : 16
    Points
    16
    Par défaut
    Pas d'idée ?

    J'ai pensé qu'il était possible que le problème vienne du fait que je n'ai pas de clé primaire sur certaine table (c'est une supposition, je ne sais pas comment verifier...).

    Est-ce cohérent? Si oui comment vérifier que j'ai une clé primaire sur chacune de mes tables?

    Merci. Je cherche mais sans trop avancer...

    Edit: Sorry je n'ai pas vu la réponse précédente avant de poster ceci,
    Le copier/coller que tu vois au dessus est après que j'ai supprimé la clé (soit disant) étrangère qui ne fonctionnait pas.

    D'après toi, faudrait-il que je créé un champ vide, puis retente la manip du ALTER TABLE ? (jvais le faire dans le doute...)

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Points : 16
    Points
    16
    Par défaut
    Après vérification d'une dizaine de mes tables, aucunes d'entre elles ne possèdent PAS de clé primaire (id_), donc je pense ne pas m'être vautré sur ce coup.

    Par contre, j'ai créé un champ id_prg dans ma table ph_construct puis
    inséré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE ph_construct
    ADD id_prg INT
    REFERENCES ph_programme (id_prg)
    Et logiquement, je reçois le message:
    #1060 - Duplicate column name 'id_prg'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ALTER TABLE ph_construct ADD id_prg INT REFERENCES ph_programme( id_prg )
    Faut-il faire un UPDATE ? ou autre chose? je suis pomé...

  19. #19
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    Ta requête ALTER... ADD id_prg REFERENCES... crée à la fois la colonne et la contrainte, donc il ne faut pas créer la colonne d'abord et lancer ta requête ensuite. Soit tu supprimes la colonne et tu lances ta requête, soit tu laisses ta colonne et tu ajoutes ensuite seulement la contrainte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE ph_construct
    ADD FOREIGN KEY (id_prg) 
    REFERENCES ph_programme (id_prg)
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Points : 16
    Points
    16
    Par défaut
    Ok, je te remercis, mon problème venait du fait que j'ai du mal à apréhender le fait que la simple clé id_prg suffise pour lier mes deux tables.


    Merci à toi.

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

Discussions similaires

  1. [clé primaire et étrangère]
    Par viny dans le forum Requêtes
    Réponses: 9
    Dernier message: 05/08/2003, 18h23
  2. clé primaire composée de 2 clés étrangères
    Par Tigresse dans le forum Installation
    Réponses: 5
    Dernier message: 28/07/2003, 14h38
  3. [Script]prob de clés étrangères
    Par Seb7 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 08/07/2003, 17h37
  4. [NETBEANS] Intégration de Jboss dans NetBeans
    Par Kleb dans le forum NetBeans
    Réponses: 1
    Dernier message: 09/06/2003, 18h45

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