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 :

Message d'erreur pour création d'une FK non présente dans la requête !


Sujet :

Requêtes MySQL

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 384
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut Message d'erreur pour création d'une FK non présente dans la requête !
    Bonjour,
    voici une requête SQL :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE country(    
        COU_ident INT UNSIGNED  AUTO_INCREMENT,    
        country CHAR(3) NOT NULL,    
        region CHAR(4) NOT NULL,    
        PRIMARY KEY(COU_ident),    
        UNIQUE(country) )
    Celle-ci génère un message d'erreur :
    Error Code: 3734. Failed to add the foreign key constraint. Missing column 'id_country' for constraint 'location_ibfk_1' in the referenced table 'country'
    sur la création d'une FK et pourtant aucune création de FK dans la requête. Pourquoi ça ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    Bonjour Laurent,

    Très certainement une autre table a dans son script une contrainte d'intégrité qui doit ressembler à quelque chose comme :
    FOREIGN KEY(ma_colonne) REFERENCES country(id_country).
    Or, dans la table country, aucune colonne ne s'appelle id_country (par contre, on trouve une colonne COU_ident...)

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,

    escartefigue : je ne pense pas, car il essaie de créer la table. Il ne peut donc pas encore exister de contrainte qui pointent dessus.

    Par contre la table et une des colonnes portent le même nom (country), peut-être que MySql s'emmêle les pinceaux entre les deux.

    Tatayo.

  4. #4
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 384
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Merci pour la réponse. En fait, j'ai constaté un bug dans ma requête : c'est COU_country que je voulais créer et pas country. J'ai corrigé et y a plus l'erreur. Je vois pas pourquoi, mais c'est résolu (ce problème-là car y en a d'autres...)
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 064
    Points
    19 064
    Par défaut
    Salut à tous.

    @ laurentSc : désolé si j'arrive en retard, je ne suis pas tout le temps dans le forum developpez.

    D'après le message d'erreur, je comprends que :

    a) vous essayez de créer une clef étrangère sur la table "country".

    b) la colonne "id_country" n'existe pas dans la table "country".

    c) vous avez attribuer comme nom de contrainte "location_ibfk_1".
    J'ai pris l'habitude de nommer mes contraintes ainsi :
    --> nom de la table où est déclaré la clef étrangère
    --> un numéro désignant le rang dans la déclaration de mes clefs étrangères.

    La déclarative de votre clef étrangère doit être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    alter table `nom_de_votre_table`
    add contrainte `nom_de_votre_table_01` foreign key (`clef_country`)
    references `country` (`cou_ident`) on update cascade on delete cascade
    clef_country est le nom de la clef étrangère dans la table "nom_de_votre_table".

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 384
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Merci pour la réponse Artemus24. A mon avis, c'est tatayo qui avait raison au post #3. Quand j'ai écrit le post #4, j'avais pas vu sa réponse, mais l'explication que je voyais pas pourrait être ce qu'il dit et d'ailleurs, je n'ai jamais créé de contrainte.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  7. #7
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 064
    Points
    19 064
    Par défaut
    Salut laurentSc.

    Citation Envoyé par laurentSc
    A mon avis, c'est tatayo qui avait raison au post #3.
    Non, Tatayo n'a pas raison. Mysql ne s'emmêle pas les pinceaux.

    Le message d'erreur est suffisamment clair et indique que la colonne "id_country" au moment de la création de la clef étrangère, n'existe pas dans la table "country".

    Par contre, quand vous dites :
    Citation Envoyé par laurentSc
    En fait, j'ai constaté un bug dans ma requête : c'est COU_country que je voulais créer et pas country.
    vous avez entièrement raison.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Dans ce cas je pense qu'il manque une partie du script: d'après le message d'erreur, il manque une colonne dans la table Country, pour une Foreign Key qui pointe vers cette table.
    Or comment une Foreign Key peut-elle exister, alors que la table référencée n'existe pas encore, puisqu'on tente justement de la créer ?

    Ou j'ai vraiment raté un truc.

    Tatayo.

  9. #9
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 384
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Je crains qu'on ne comprenne pas. Effectivement, pourquoi une erreur sur la création d'une FK référençant une table pas encore créée ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  10. #10
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 064
    Points
    19 064
    Par défaut
    Expliquez moi comment peut-on avoir cette erreur lors de la création de la clef étrangère si la table "country" n'existe pas ?
    Inversement, l'existence d'une clef étrangère empêche la destruction de la table référencée par la clef étrangère.

    La bonne manipulation est d'abord de créer la table référence (ou table mère), puis de créer la table fille et enfin de créer la clef étrangère.

    J'ai reproduis chez moi la même erreur que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    --------------
    alter table `fille`
    add CONSTRAINT `FK_01` FOREIGN KEY (`mere_id`) REFERENCES `mere` (`mere_id2`) ON DELETE CASCADE ON UPDATE CASCADE
    --------------
     
    ERROR 3734 (HY000) at line 3: Failed to add the foreign key constraint. Missing column 'mere_id2' for constraint 'FK_01' in the referenced table 'mere'
     
    Appuyez sur une touche pour continuer...
    l'identifiant "mere_id2" n'existe pas et du coup j'ai bien l'erreur 3734 !

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Justement, dans la requête de LaurentSc, je ne vois ni ALTER TABLE, ni DROP TABLE.
    Juste un CREATE TABLE.
    Je ne vois pas non plus de déclaration d'une clé étrangère.
    Vu que LaurentSc ne montre qu'une seule requête, je suis parti du principe que c'est la seule exécutée, et qu'elle seule déclenche l'erreur indiquée.

    Donc pourquoi MySql indique qu'il manque une colonne dans la table Country, pour "satisfaire" la définition d'une clé étrangère sur cette table Country ?
    Vu que la table n'existe pas encore, d'où sort cette clé étrangère ? Comment peut-elle exister avant la table country ?

    LaurentSc, quelle est la définition de la contrainte location_ibfk_1 ?

    Tatayo.

  12. #12
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 064
    Points
    19 064
    Par défaut
    Salut Tatayo.

    Citation Envoyé par Tatayo
    Justement, dans la requête de LaurentSc, je ne vois ni ALTER TABLE, ni DROP TABLE.
    Parce qu'il a oubli de nous donner toutes les manipulations qu'il a fait.
    Je suppose même qu'au moment de la création de son sujet, il ne se souvenait pas de tout ce qu'il avait fait.

    Citation Envoyé par Tatayo
    Vu que LaurentSc ne montre qu'une seule requête, je suis parti du principe que c'est la seule exécutée, et qu'elle seule déclenche l'erreur indiquée.
    D'où le fait qu'il nous a induit en erreur.

    L'erreur 3734 ne peut apparaitre que sur une tentative de création d'une clef étrangère.

    Citation Envoyé par Tatayo
    Donc pourquoi MySql indique qu'il manque une colonne dans la table Country, pour "satisfaire" la définition d'une clé étrangère sur cette table Country ?
    La seule information fiable que tu trouves dans le premier message de laurentSc est le message d'erreur.
    En lisant le message qui est associé à cet erreur, tu découvres que :
    a) la table "counrty" existe.
    b) dans un autre table dont on ne connait pas le nom, une tentative de création d'une clef étrangère a été faite.
    c) la clef étrangère pointe sur la colonne "id_country" qui n'existe pas, dans la table "country".
    d) et dernière information, la contrainte se nomme dans la base de données "ocation_ibfk_1".

    Je ne sais pas comment il a fait pour créer cette clef étrangère.
    Est-ce à la main ou en lançant un script ?

    Citation Envoyé par Tatayo
    Vu que la table n'existe pas encore, d'où sort cette clé étrangère ? Comment peut-elle exister avant la table country ?
    Tes deux hypothèses sont fausses.
    Une clef étrangère existe et est donc référencée par le nom de sa contrainte que si la table en référence existe déjà.
    Si la table référencée n'existe pas, la clef étrangère ne peut exister.
    Et inversement, si la clef étrangère existe, tu ne peux pas détruire la table référencée.

    La seule hypothèse logique est que laurentSc a d'abord créé la table "country", puis dans une autre table, il a créé la clef étrangère sur une colonne qui n'existe pas.
    C'est tout ce que je peux dire de son erreur, puisque j'ai pu la reproduire dans mon environnement.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  13. #13
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 384
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Je suppose même qu'au moment de la création de son sujet, il ne se souvenait pas de tout ce qu'il avait fait.
    C'est malheureusement fort possible, car depuis mon grave accident en 2000 (!), ma mémoire immédiate est très mauvaise (du style incapable de dire ce que j'ai fait 5 minutes auparavant)

    Citation Envoyé par tatayo Voir le message
    LaurentSc, quelle est la définition de la contrainte location_ibfk_1 ?
    Aucune idée vu que je n'ai vu ce nom que dans le message d'erreur.

    J'ai ré-exécuté la requête du post #1 après avoir fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SET FOREIGN_KEY_CHECKS = 0; 
    DROP TABLE country
    SET FOREIGN_KEY_CHECKS = 1;
    et cette fois, le message d'erreur est
    Error Code: 1215. Cannot add foreign key constraint
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/06/2020, 16h51
  2. [AC-2010] Afficher les enregistrements d'une table non présents dans une requête
    Par Mauricianstyle dans le forum Access
    Réponses: 4
    Dernier message: 24/04/2015, 14h14
  3. Réponses: 1
    Dernier message: 30/05/2011, 00h40
  4. Réponses: 7
    Dernier message: 14/08/2008, 20h40
  5. Réponses: 5
    Dernier message: 07/03/2008, 11h46

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