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

  1. #1
    Candidat au Club
    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
    Expert éminent sénior
    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
    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
    Candidat au Club
    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
    Candidat au Club
    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
    Expert éminent sénior
    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
    Candidat au Club
    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
    Expert éminent sénior
    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
    Candidat au Club
    Ce message n'a pas pu être affiché car il comporte des erreurs.

  10. #10
    Expert éminent sénior
    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

    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

###raw>template_hook.ano_emploi###