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

Langage SQL Discussion :

Erreur 1005 lors de la création d'une clé étrangère.


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 15
    Points : 15
    Points
    15
    Par défaut Erreur 1005 lors de la création d'une clé étrangère.
    Bonjour,
    Je suis actuellement en BTS informatique et on a commencé le SQL. Je voulais créer une clé étrangère.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    describe Vehicule; +------------------+--------------+------+-----+---------+-------+
    | Field            | Type         | Null | Key | Default | Extra |
    +------------------+--------------+------+-----+---------+-------+
    | immatriculation  | varchar(10)  | YES  |     | NULL    |       |
    | modèle           | varchar(100) | YES  |     | NULL    |       |
    | codeTypeVehicule | varchar(5)   | NO   | PRI | NULL    |       |
    +------------------+--------------+------+-----+---------+-------+
    describe Location; 
    +---------------+-------------+------+-----+---------+-------+
    | Field         | Type        | Null | Key | Default | Extra |
    +---------------+-------------+------+-----+---------+-------+
    | ID            | int(11)     | NO   | PRI | NULL    |       |
    | dateDebut     | date        | YES  |     | NULL    |       |
    | dateFin       | date        | YES  |     | NULL    |       |
    | immatVehicule | varchar(10) | YES  |     | NULL    |       |
    +---------------+-------------+------+-----+---------+-------+
    ALTER TABLE Location
        -> ADD FOREIGN KEY(immatVehicule)
        -> REFERENCES Vehicule(immatriculation);
    ERROR 1005 (HY000): Can't create table `gervaa`.`Location` (errno: 150 "Foreign key constraint is incorrectly formed")
    show warnings; 
    | Warning |  150 | Alter  table `gervaa`.`Location` with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns near 'FOREIGN KEY(immatVehicule) REFERENCES Vehicule(immatriculation)'. |
    | Error   | 1005 | Can't create table `gervaa`.`Location` (errno: 150 "Foreign key constraint is incorrectly formed")                                                                                                                                              |
    | Warning | 1215 | Cannot add foreign key constraint for `Location`

    Et j'ai ce message d'erreur, j'ai cherché un peu partout mais j'ai pas trouvé.
    Merci à ceux qui m'aideront !

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Une foreign key est une colonne dans une table qui fait référence à une colonne d'une autre table.

    La syntaxe est donc : FOREIGN KEY(ma_colonne) REFERENCES mon_autre_table(mon_autre_colonne).

    Par ailleurs, il semble que dans votre première table, la PK soit le code type.
    C'est un très mauvais choix, on a dû vous apprendre que l'identifiant primaire doit être stable et donc dénué de sens, par ailleurs ce choix implique que un seul véhicule peut avoir ce type (puisqu'il y a par ailleurs l'immatriculation dans cette table), c'est aberrant !
    Ajoutez un idenfiant technique de type integer dans cette table comme vous l'avez fait pour l'autre table et n'utilisez l'immatriculation que comme identifiant unique, mais non primaire
    Enfin du varchar court comme varchar(5) ou varchar(10) est contre-performant, à remplacer par du char fixe.

  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,
    L'origine du problème est indiquée dans le message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    There is no index in the referenced table where the referenced columns appear as the first columns near 'FOREIGN KEY(immatVehicule) REFERENCES Vehicule(immatriculation)
    Il manque un index unique sur la colonne référencée.

    Tatayo.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 15
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Bonjour,

    Une foreign key est une colonne dans une table qui fait référence à une colonne d'une autre table.

    La syntaxe est donc : FOREIGN KEY(ma_colonne) REFERENCES mon_autre_table(mon_autre_colonne).

    Par ailleurs, il semble que dans votre première table, la PK soit le numéro d'immatriculation.
    C'est un très mauvais choix, on a dû vous apprendre que l'identifiant primaire doit être stable et donc dénué de sens.
    Ajoutez un idenfiant technique de type integer dans cette table comme vous l'avez fait pour l'autre table et n'utilisez l'immatriculation que comme identifiant unique, mais non primaire
    Enfin du varchar court comme varchar(5) ou varchar(10) est contre-performant, à remplacer par du char fixe.
    D'accord merci, mais cependant ce n'est pas moi qui choisit le référencement de la clé étrangère c'est dans une énoncé. Je suis donc obligé de lié la PK immatVehicule à immatriculation

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 15
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    L'origine du problème est indiquée dans le message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    There is no index in the referenced table where the referenced columns appear as the first columns near 'FOREIGN KEY(immatVehicule) REFERENCES Vehicule(immatriculation)
    Il manque un index unique sur la colonne référencée.

    Tatayo.
    J'avais vu sur un forum également que c'est l'index qui pouvait poser problème. Cependant j'ai essayé d'en mettre un et ça n'a pas fonctionné. Pouvez-vous me donner la commande pour créer l'index svp ? Je me suis sûrement tromper.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Remarque supplémentaire : je ne suis pas fan du renommage des FK dans les différentes tables.
    Si la colonne s'appelle "immatriculation" dans une table, pourquoi la nommer "immatVehicule" dans une autre ?
    Si la colonne est propagée dans 5 tables il faut connaître la correspondance des 5 noms ?
    Complexité inutile.
    Pour moi, la seule exception à la règle qui ait du sens est le cas où le même attribut est présent deux fois dans une même table (cas des relations réflexives père/fils, composant/composé etc.). En ce cas on est contraint de renommer l'un des deux ou les deux attributs, unicité oblige .

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 15
    Points : 15
    Points
    15
    Par défaut
    Encore une fois je suis d'accord avec vous mais c'est un exercice de BTS BLANC (car annulé avec le COVID) et je dois suivre l'énoncé, je ne peux pas nommé les colonnes comme je le souhaite.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par GeRvaxx- Voir le message
    D'accord merci, mais cependant ce n'est pas moi qui choisit le référencement de la clé étrangère c'est dans une énoncé. Je suis donc obligé de lié la PK immatVehicule à immatriculation
    D'après le describe, la clef primaire n'est pas sur l'immatriculation mais sur le code type.
    Comme mentionné plus haut, vu que l'immatriculation et le code type sont dans la même table et que la PK est sur le code type, alors il ne peut y avoir qu'un seul véhicule par code type

    Si votre énoncé stipule que c'est l'immatriculation qui doit servir de PK, je vous invite à proposer un peu de lecture à votre enseignant en lui communiquant le lien ci-dessous :
    https://sgbd.developpez.com/actu/859...es-par-fsmrel/

    Choisir une immatriculation comme PK est une erreur de débutant, indigne d'un enseignant

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 15
    Points : 15
    Points
    15
    Par défaut
    Choisir une immatriculation comme PK est une erreur de débutant, indigne d'un enseignant [/QUOTE]

    Je me disais bien qu'il n'était pas serein quand il nous faisait cours. De plus, quand on lui pose des questions il nous dit de chercher par nous même sans forcément nous aider (je suis presque sûr qu'il ne connaît pas la réponse). Du coup ce n'est pas possible de lié une clé étrangère à l'immatriculation si j'ai bien compris ?

    Merci en tout cas pour vos réponses.

    Voici par ailleurs l'énoncé si ça peut vous aider ^^ : dst1 sql.docx

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    L'énoncé confirme que l'enseignant a besoin de se recycler :

    • il propose des identifiants primaires fonctionnels (immatriculation, code véhicule) soit exactement ce qu'il ne faut jamais faire
    • il propose un modèle qui permet de louer plusieurs fois le même véhicule à des périodes chevauchantes
    • il fait des jointures sans utiliser l'opérateur JOIN, au détriment des performances et de la lisibilité (et avec une syntaxe qui date de plus de 20 ans)
    • cerise sur le gâteau : il est nul en orthographe (nombre de véhicules, nombre de locations)


    Je suis persuadé que vous en apprendrez plus en posant vos questions sur le site developpez.net qu'en suivant ses cours

  11. #11
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Citation Envoyé par GeRvaxx- Voir le message
    Du coup ce n'est pas possible de lié une clé étrangère à l'immatriculation si j'ai bien compris ?
    Si c'est possible, mais votre table ne reflète pas l'énoncé : selon ce dernier, la clef primaire de la table Vehicule est la colonne immatriculation, hors d’après votre script, vous avez mis la clef primaire sur la colonne CodeTypeVehicule (qui est en fait une clef étrangère...)

    une fois corrigé ce problème, vous pourrez poser vos clefs étrangères référençant la table Vehicule sans problème, et finir ce devoir qui semble en effet dater d'il y a trente ans, quand l'opérateur de jointure JOIN et les correcteurs orthographiques n’existaient pas

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

Discussions similaires

  1. [MySQL-5.6] Erreur lors de la création d'une clé étrangère
    Par BobyDEJ dans le forum Requêtes
    Réponses: 2
    Dernier message: 30/07/2015, 17h16
  2. Erreur LNK2019 lors de la création d'une DLL
    Par Orhleil dans le forum Visual C++
    Réponses: 2
    Dernier message: 10/12/2011, 01h03
  3. [SP-2007] Erreur inconnu lors de la création d'une application Web
    Par hassine dans le forum SharePoint
    Réponses: 18
    Dernier message: 24/08/2010, 09h48
  4. ERREUR incompréhensible lors de la création d'une fonction
    Par BATAK dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 15/10/2009, 22h36
  5. Erreur: 1005 lors de la création d'une table
    Par developppez dans le forum MySQL
    Réponses: 3
    Dernier message: 15/12/2008, 15h45

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