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

MySQL Discussion :

Je n'arrive pas à créer de contrainte de clé étrangère (INNODB) pour une table [MySQL-5.6]


Sujet :

MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Je n'arrive pas à créer de contrainte de clé étrangère (INNODB) pour une table
    Bonjour tout le monde,
    Je débute en PHP/mySQL et en HTML. Cela fait plus d’un mois que j’essaie de faire un menu hiérarchique déroulant avec utilisation de mySQL sans succès. J’ai créé ma base (Tartempion) dans laquelle j’ai mis au moins 3 tables :
    - Table : Page
    Id int(11) ;
    Titre varchar(50) ;
    Disp_order int(11) ;
    Main_page tinyint(4) ;

    Voici son index que j’ai créé :
    Action Nom de l'index Type Unique Compressé Colonne Cardinalité Interclas- Null Commentaire
    -sement
    Modifier
    Supprimer PRIMARY BTREE Oui Non id 6 A Non

    - Table : Sub_page
    Id int(11) ;
    Page_id int(11) ;
    Titre varchar(50) ;
    Content text ;
    Disp_order int(11) ;

    Voici ses index que j’ai créés :
    Action Nom de l'index Type Unique Compressé Colonne Cardinalité Interclas- Null Commentaire
    -sement
    Modifier
    Supprimer PRIMARY BTREE Oui Non id 6 A Non

    page_id 6 A Non
    Modifier
    Supprimer Sub_page_ibfk_1 BTREE Non Non page_id 6 A Non

    - Table : Sub_sub_page
    Id int(11) ;
    Page_id int(11) ;
    Sub_page_id int(11) ;
    Titre varchar(50) ;
    Content text ;
    Disp_order int(11) ;

    Voici ses index que j’ai créés :
    Action Nom de l'index Type Unique Compressé Colonne Cardinalité Interclas- Null Commentaire
    -sement
    Modifier
    Supprimer PRIMARY BTREE Oui Non id 1 A Non

    page_id 1 A Non
    Modifier
    Supprimer Sub_sub_page_ BTREE Non Non page_id 1 A Non
    ibfk_1

    J’ai créé avec succès la contrainte de clé étrangère (INNODB) pour la table Sub_page (la clé est : « id »).
    J’aimerais créer la contrainte de clé étrangère (INNODB) pour la table Sub_sub_page et je n’arrive pas à associer la clé de la table Sub_page à celle de la table Sub_sub_page. Voici ce que j’ai mis :
    Colonne Nom de la Base Table Index
    De données
    Id tartempion
    Sub_page_id tartempion J’ai mis : Rien ne sort pour que je choisisse l’index
    "Sub_page"

    L’arborescence du menu que je cherche à programmer est le suivant :
    Menu 1 Menu2 Menu3 Menu4
    Sous_Menu1
    Sous_Menu2
    Sous_Sous_Menu1
    Sous_Sous_Menu2
    Sous_Sous_Menu3
    Sous_Menu3

    Aidez-moi à créer la contrainte de clé étrangère pour la table Sub_sub_page.
    Merci d’avance à tous.

  2. #2
    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 065
    Points
    19 065
    Par défaut
    Salut ferruphphtml.

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `page`
    --------------
     
    --------------
    CREATE TABLE IF NOT EXISTS `page`
    ( `id`    integer unsigned not null auto_increment primary key,
      `lib`   varchar(255)     not null
    ) engine=innoDB
      default charset=latin1 collate=latin1_general_ci
      row_format=compressed
    --------------
     
    --------------
    insert into `page` (`lib`) values
      ('Menu 1'),('Menu 2'),('Menu 3'),('Menu 4')
    --------------
     
    --------------
    select * from `page`
    --------------
     
    +----+--------+
    | id | lib    |
    +----+--------+
    |  1 | Menu 1 |
    |  2 | Menu 2 |
    |  3 | Menu 3 |
    |  4 | Menu 4 |
    +----+--------+
    --------------
    DROP TABLE IF EXISTS `subpage`
    --------------
     
    --------------
    CREATE TABLE IF NOT EXISTS `subpage`
    ( `id`       integer unsigned not null auto_increment primary key,
      `page_id`  integer unsigned not null,
      `lib`      varchar(255)     not null,
      CONSTRAINT `FK_01` FOREIGN KEY (`page_id`) REFERENCES `page` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) engine=innoDB
      default charset=latin1 collate=latin1_general_ci
      row_format=compressed
    --------------
     
    --------------
    insert into `subpage` (`page_id`,`lib`) values
      (1,'Menu 1-1'),(1,'Menu 1-2'),
      (2,'Menu 2-1'),(2,'Menu 2-2'),(2,'Menu 2-3'),
      (3,'Menu 3-1'),(3,'Menu 3-2'),
      (4,'Menu 4-1'),(4,'Menu 4-2')
    --------------
     
    --------------
    select * from `subpage`
    --------------
     
    +----+---------+----------+
    | id | page_id | lib      |
    +----+---------+----------+
    |  1 |       1 | Menu 1-1 |
    |  2 |       1 | Menu 1-2 |
    |  3 |       2 | Menu 2-1 |
    |  4 |       2 | Menu 2-2 |
    |  5 |       2 | Menu 2-3 |
    |  6 |       3 | Menu 3-1 |
    |  7 |       3 | Menu 3-2 |
    |  8 |       4 | Menu 4-1 |
    |  9 |       4 | Menu 4-2 |
    +----+---------+----------+
    --------------
    DROP TABLE IF EXISTS `subsubpage`
    --------------
     
    --------------
    CREATE TABLE IF NOT EXISTS `subsubpage`
    ( `id`          integer unsigned not null auto_increment primary key,
      `subpage_id`  integer unsigned not null,
      `lib`         varchar(255)     not null,
      CONSTRAINT `FK_02` FOREIGN KEY (`subpage_id`) REFERENCES `subpage` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) engine=innoDB
      default charset=latin1 collate=latin1_general_ci
      row_format=compressed
    --------------
     
    --------------
    insert into `subsubpage` (`subpage_id`,`lib`) values
      (1,'Menu 1-1-1'),(1,'Menu 1-1-2'),
      (2,'Menu 1-2-1'),(2,'Menu 1-2-2'),
      (3,'Menu 2-1-1'),(3,'Menu 2-1-2'),
      (4,'Menu 2-2-1'),(4,'Menu 2-2-2'),
      (5,'Menu 2-3-1'),(5,'Menu 2-3-2'),(5, 'Menu 2-3-1'),
      (6,'Menu 3-1-1'),(6,'Menu 3-1-2'),(6, 'Menu 3-1-3'),
      (7,'Menu 3-2-1'),(7,'Menu 3-2-2'),(7, 'Menu 3-2-1'),
      (8,'Menu 4-1-1'),(8,'Menu 4-1-2'),
      (9,'Menu 4-2-1'),(9,'Menu 4-2-2')
    --------------
     
    --------------
    select * from `subpage`
    --------------
     
    +----+---------+----------+
    | id | page_id | lib      |
    +----+---------+----------+
    |  1 |       1 | Menu 1-1 |
    |  2 |       1 | Menu 1-2 |
    |  3 |       2 | Menu 2-1 |
    |  4 |       2 | Menu 2-2 |
    |  5 |       2 | Menu 2-3 |
    |  6 |       3 | Menu 3-1 |
    |  7 |       3 | Menu 3-2 |
    |  8 |       4 | Menu 4-1 |
    |  9 |       4 | Menu 4-2 |
    +----+---------+----------+
    --------------
    select t1.lib,
           t2.lib,
           t3.lib
    from             page as t1
     
    inner join    subpage as t2
    on t2.page_id = t1.id
     
    inner join subsubpage as t3
    on t3.subpage_id = t2.id
    --------------
     
    +--------+----------+------------+
    | lib    | lib      | lib        |
    +--------+----------+------------+
    | Menu 1 | Menu 1-1 | Menu 1-1-1 |
    | Menu 1 | Menu 1-1 | Menu 1-1-2 |
    | Menu 1 | Menu 1-2 | Menu 1-2-1 |
    | Menu 1 | Menu 1-2 | Menu 1-2-2 |
    | Menu 2 | Menu 2-1 | Menu 2-1-1 |
    | Menu 2 | Menu 2-1 | Menu 2-1-2 |
    | Menu 2 | Menu 2-2 | Menu 2-2-1 |
    | Menu 2 | Menu 2-2 | Menu 2-2-2 |
    | Menu 2 | Menu 2-3 | Menu 2-3-1 |
    | Menu 2 | Menu 2-3 | Menu 2-3-2 |
    | Menu 2 | Menu 2-3 | Menu 2-3-1 |
    | Menu 3 | Menu 3-1 | Menu 3-1-1 |
    | Menu 3 | Menu 3-1 | Menu 3-1-2 |
    | Menu 3 | Menu 3-1 | Menu 3-1-3 |
    | Menu 3 | Menu 3-2 | Menu 3-2-1 |
    | Menu 3 | Menu 3-2 | Menu 3-2-2 |
    | Menu 3 | Menu 3-2 | Menu 3-2-1 |
    | Menu 4 | Menu 4-1 | Menu 4-1-1 |
    | Menu 4 | Menu 4-1 | Menu 4-1-2 |
    | Menu 4 | Menu 4-2 | Menu 4-2-1 |
    | Menu 4 | Menu 4-2 | Menu 4-2-2 |
    +--------+----------+------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Merci beaucoup pour ton aide Artemus24. Mais je ne m'en sors toujours pas
    Merci beaucoup pour ton aide Artemus24. Mais je ne m'en sors toujours pas car en insérant dans ma base les tables, l'insertion de la table 'sub_sub_page' me donne l'erreur suivante : "error 1452 (23000) : Cannot add or update a child row : a foreign key constraint fails". Je suis en train de chercher l'erreur. Je t'enverrai plus tard des smiles pour te remercier davatage.

  4. #4
    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 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Toute contrainte de clef étrangère doit obligatoirement porter sur une clef (pas forcément primary) de la table mère vers laquelle la contrainte est vérifiée
    Le nombre et les types de colonne de la table fille doivent être les mêmes que ceux de la table mère, les noms de colonnes peuvent être différents
    Les index correspondants doivent être créés

    L'exemple que vous a communiqué Artemus24 respecte ces règles, votre script ne les respecte très probablement pas, d'où l'erreur

  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 065
    Points
    19 065
    Par défaut
    Salut à tous.

    Hormis ce qu'à dit Escartefigue, vous pouvez rencontrer d'autres problèmes :

    1) avez-vous le même moteur entre la table mère et la table fille ?
    Vous devez impérativement mettre "engine=innodb".
    MyIsam ne supporte pas les clefs étrangères.

    2) N'y a-t-il pas une ambiguïté sur le nom de votre colonne ?

    3) hormis le NULL qui est autorisé en tant que valeur de la clef étrangère, toutes les autres valeurs doivent impérativement exister dans la table référencée.
    Vous ne pouvez pas insérer une ligne dans la table fille qui va faire référence à la ligne de la table mère avant celle-ci.
    La clef étrangère sert à créer une contrainte d'intégrité.

    4) de même pour supprimer une ligne de la table mère, vous devez d'abord supprimer toutes les lignes de la table fille.
    On peut outrepasser cette contrainte en mettant "on delete cascade".

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

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Merci à tous ceux qui m'ont aidé, j'ai trouvé mon erreur
    Merci à tous ceux qui m'ont aidé, j'ai trouvé mon erreur qui provient de la table sub_menu où il me manquait un élément par rapport à la table sub_sub_menu.

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

Discussions similaires

  1. Probleme: Je n'arrive pas à créer un fichier (text)
    Par developpeur82 dans le forum NetBeans
    Réponses: 0
    Dernier message: 30/03/2010, 17h43
  2. [SP-2007] Je n'arrive pas à créer un site d’actualités avec MOSS 2007
    Par kaltama dans le forum SharePoint
    Réponses: 0
    Dernier message: 04/02/2010, 10h49
  3. Je n'arrive pas créer mon site
    Par floreiki dans le forum Débuter
    Réponses: 2
    Dernier message: 15/01/2010, 14h45
  4. Je n'arrive pas à créer un JAR
    Par sovo dans le forum Débuter avec Java
    Réponses: 12
    Dernier message: 20/07/2009, 12h42
  5. Réponses: 19
    Dernier message: 20/05/2007, 23h12

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