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 :

Clé étrangère sur table intermédiaire dans relation plusieurs à plusieurs


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai Avatar de GuyAntonin
    Homme Profil pro
    Bidouilleur informatique
    Inscrit en
    Décembre 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Bidouilleur informatique

    Informations forums :
    Inscription : Décembre 2016
    Messages : 16
    Points : 11
    Points
    11
    Par défaut Clé étrangère sur table intermédiaire dans relation plusieurs à plusieurs
    Bonjour,

    Il s'agit d'une BD pour un blog. Il y a, entre autres, 2 tables : Article et Categorie. A l'évidence, 1 catégorie contient plusieurs articles mais également, un article peut appartenir à plusieurs catégories.

    Il apparait donc une table intermédiaire Categorie_article avec une clé primaire multiple sur 2 colonnes article_id et categorie_id. Je cherche à créer 1 clé étrangère sur chacune de ces 2 colonnes pointant respectivement sur Article(id) et Categorie(id).

    MySQL exécute les 2 requêtes sans sourciller mais lorsque je demande un SHOW INDEX, 1 seule des 2 contraintes s'affiche. Ceci ne serait pas gênant si ce n'est que MySQL refuse d'alimenter la table (voir la copie d'écran).

    J'ai testé plusieurs configuration pour essayer de comprendre. Je me suis aperçu que l'ordre de déclaration dans la clé primaire multiple a une incidence sur le problème. C'est la clé sur la 1ère colonne qui ne s'affiche pas. Et pourtant MySQL affirme un Query OK.

    Je vous remercie de bien vouloir éclairer ma lanterne :-)

    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
    mysql> DROP TABLE Categorie_article;
    Query OK, 0 rows affected (0.01 sec)
     
    mysql> CREATE TABLE Categorie_article
        -> (article_id INT UNSIGNED,
        ->  categorie_id INT UNSIGNED,
        -> PRIMARY KEY (categorie_id, article_id),
        -> CONSTRAINT fk_catart_categorie_id FOREIGN KEY (categorie_id) REFERENCES Categorie(id),
        -> CONSTRAINT fk_catart_article_id FOREIGN KEY (article_id) REFERENCES Article(id)
        -> )
        -> ENGINE=INNODB;
    Query OK, 0 rows affected (0.03 sec)
     
    mysql> SHOW INDEX IN Categorie_article;
    +-------------------+------------+----------------------+--------------+--------------+-----------+-------------
    | Table             | Non_unique | Key_name             | Seq_in_index | Column_name  | Collation | Cardinality
    +-------------------+------------+----------------------+--------------+--------------+-----------+-------------
    | categorie_article |          0 | PRIMARY                |                 1 | categorie_id | A         |           0
    | categorie_article |          0 | PRIMARY                |                 2 | article_id     | A         |           0
    | categorie_article |          1 | fk_catart_article_id  |                 1 | article_id     | A         |           0
    +-------------------+------------+----------------------+--------------+--------------+-----------+-------------
    3 rows in set (0.01 sec)
     
    mysql>
    mysql> INSERT INTO Categorie_article (categorie_id, article_id)
        -> VALUES (1,1),(9,1),(2,2),(2,7),(3,4),(3,8),(4,1),(4,10),(5,3),
        -> (6,1),(6,7),(6,11),(7,2),(7,12),(8,5),(8,6),(9,2),(9,6),
        -> (10,2),(10,6),(10,11),(10,12),(11,4),(12,3),(12,8),(13,4),
        -> (13,9),(14,12),(14,1),(15,5);
    ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`mon_blog`.`categorie_article`, CONSTRAINT `fk_catart_categorie_id` FOREIGN KEY (`categorie_id`) REFERENCES `categorie` (`id`))
    mysql>
    Cordialement - Antonin

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Hello Antonin,

    Les 2 contraintes étant créées
    il faut maintenant pour que cette insertion marche
    mysql> INSERT INTO Categorie_article (categorie_id, article_id)
    -> VALUES (1,1),(9,1),(2,2),(2,7),(3,4),(3,8),(4,1),(4,10),(5,3),
    -> (6,1),(6,7),(6,11),(7,2),(7,12),(8,5),(8,6),(9,2),(9,6),
    -> (10,2),(10,6),(10,11),(10,12),(11,4),(12,3),(12,8),(13,4),
    -> (13,9),(14,12),(14,1),(15,5);
    que pour chaque couple indiqué :

    (1,1)
    =>
    Que la catégorie 1 existe dans la table catégorie et l'article 1 existe dans la table article ?

    (9,1)
    =>
    Que la catégorie 9 existe dans la table catégorie et l'article 1 existe dans la table article ?
    etc ...

  3. #3
    Membre à l'essai Avatar de GuyAntonin
    Homme Profil pro
    Bidouilleur informatique
    Inscrit en
    Décembre 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Bidouilleur informatique

    Informations forums :
    Inscription : Décembre 2016
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Effectivement, à un moment je me suis trouvé avec ce problème. A force de triturer le code dans tous les sens pour essayer de comprendre, j'avais inversé les colonnes dans la déclaration mais pas dans l'alimentation de la table.

    Mais il y a autre choses. Lorsque je déclare les clés étrangères, MySQL est content et me sort des Query OK. J'alimente la base et certaines tables sont en erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mysql> INSERT INTO Categorie_article (cart_cat_id, cart_art_id)
        -> VALUES (3,1),(6,1),(1,2),(3,2),(6,2),(5,3),(6,3),(1,4),(3,5),(6,5),(1,6),(2,6),(1,7),(2,8),
        -> (1,9),(2,9),(2,10),(3,10),(4,10),(2,11),(5,11),(6,11),(4,12),(5,12),(1,13),(6,13);
    ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`mon_blog`.`categorie_article`, CONSTRAINT `fk_catart_article_id` FOREIGN KEY (`cart_art_id`) REFERENCES `article` (`id`))
    mysql>
    J'ai plus contourné le problème que je ne l'ai résolu de la façon suivante : j'alimente la base puis je déclare les clés étrangères. Et là, tout est pour le mieux dans le meilleur des mondes (enfin, apparemment).

    Voilà qui est bien trop compliqué pour mes petites neurones...
    Cordialement - Antonin

  4. #4
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Si tu me donnes les "create" avec le contenu ("insert") des tables article et categorie,
    moi ou un/e autre pourrait te montrer que les erreurs lors des "insert" à la suite du "create" de la table categorie_article + mise en place des contraintes
    ont sans aucun doute une explication bien rationnelle ...
    ... à toi de voir si tu souhaites comprendre ce qui se passe ...

  5. #5
    Membre à l'essai Avatar de GuyAntonin
    Homme Profil pro
    Bidouilleur informatique
    Inscrit en
    Décembre 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Bidouilleur informatique

    Informations forums :
    Inscription : Décembre 2016
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Alors voilà. Lorsque le bloc des clés étrangères est avant l'alimentation de la base, config telle que tu la trouveras ci-dessous, ça plante. Si tu mets ce bloc après, ça roule.

    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
    -- Effacer la base
    -- ---------------
    DROP DATABASE IF EXISTS mon_blog;
     
     
    -- Créer la base
    -- -------------
    CREATE DATABASE mon_blog CHARACTER SET 'utf8';
    USE mon_blog;
     
     
    -- Créer les tables
    -- ----------------
    CREATE TABLE Categorie
    	(id INT UNSIGNED AUTO_INCREMENT,
    	 nom VARCHAR(150) NOT NULL,
    	 description TINYTEXT NOT NULL,
    	PRIMARY KEY (id),
    	FULLTEXT ind_nom (nom(20))
    	)
    	ENGINE=INNODB;
     
    CREATE TABLE Article
    	(id INT UNSIGNED AUTO_INCREMENT,
    	 art_date DATETIME, 
    	 titre VARCHAR(40) NOT NULL,
    	 resume TINYTEXT NOT NULL,
    	 art_texte TEXT NOT NULL,
    	 art_util_id INT UNSIGNED NOT NULL,
    	 art_cat_id INT UNSIGNED NOT NULL,
    	PRIMARY KEY (id),
    	FULLTEXT ind_titre (titre)
    	)
    	ENGINE=INNODB;
     
    CREATE TABLE Categorie_article
    	(cart_art_id INT UNSIGNED NOT NULL,
     
    	 cart_cat_id INT UNSIGNED NOT NULL,
     
    	PRIMARY KEY (cart_art_id, cart_cat_id)
     
    	)
    	ENGINE=INNODB;
     
    CREATE TABLE Utilisateur
    	(id INT UNSIGNED AUTO_INCREMENT,
    	 pseudo VARCHAR(40) NOT NULL,
    	 email VARCHAR(40) NOT NULL,
    	 mot_passe VARBINARY(16) NOT NULL,
    	PRIMARY KEY (id),
    	UNIQUE ind_uni_pseudo_email (pseudo, email),
    	FULLTEXT ind_pseudo (pseudo(20))
    	)
    	ENGINE=INNODB;
     
    CREATE TABLE Commentaire
    	(id INT UNSIGNED AUTO_INCREMENT,
    	 com_date DATETIME, 
    	 com_texte TEXT NOT NULL,
    	 com_art_id INT UNSIGNED NOT NULL,
    	 com_util_id INT UNSIGNED,
    	PRIMARY KEY (id)
    	)
    	ENGINE=INNODB;
     
     
     
    -- Ajouter les clés étrangères
    -- ---------------------------
    ALTER TABLE Categorie_article
    ADD CONSTRAINT fk_catart_article_id FOREIGN KEY (cart_art_id) REFERENCES Article(id);
     
    ALTER TABLE Categorie_article
    ADD CONSTRAINT fk_catart_categorie_id FOREIGN KEY (cart_cat_id) REFERENCES Categorie(id);
     
    ALTER TABLE Article
    ADD CONSTRAINT fk_art_utilisateur_id FOREIGN KEY (art_util_id) REFERENCES Utilisateur(id);
     
    ALTER TABLE Article
    ADD CONSTRAINT fk_art_categorie_id FOREIGN KEY (art_cat_id) REFERENCES Categorie(id);
     
    ALTER TABLE Commentaire
    ADD CONSTRAINT fk_comm_article_id FOREIGN KEY (com_art_id) REFERENCES Article(id);
     
    ALTER TABLE Commentaire
    ADD CONSTRAINT fk_comm_utilisateur_id FOREIGN KEY (com_util_id) REFERENCES Utilisateur(id);
     
     
    -- Alimenter la base
    -- -----------------
    INSERT INTO Categorie (id, nom, description)
    VALUES (1,'Rouge','Soleil couchant'),
    	(2,'Orange','Fruit d''Espagne'),
    	(3,'Jaune','L''or en barre'),
    	(4,'Vert','Végétation au printemps'),
    	(5,'Bleu','Ciel du midi'),
    	(6,'Violet','Artichaut de Provence'),
    	(7,'Indigo','Pastel des teinturiers');
     
    INSERT INTO Article (id, art_date, titre, resume, art_texte, art_util_id, art_cat_id)
    VALUES (1,'2012/12/01 02:56','Titre_1','résumé_1','texte_1',1,3),
    	(2,'2014/03/10 17:01','Titre_2','résumé_2','texte_2',2,1),
    	(3,'2012/05/18 01:17','Titre_3','résumé_3','texte_3',3,5),
    	(4,'2014/08/13 22:14','Titre_4','résumé_4','texte_4',4,1),
    	(5,'2012/10/07 06:04','Titre_5','résumé_5','texte_5',5,3),
    	(6,'2013/05/05 12:56','Titre_6','résumé_6','texte_6',6,1),
    	(7,'2013/09/22 23:53','Titre_7','résumé_7','texte_7',6,1),
    	(8,'2013/02/04 05:42','Titre_8','résumé_8','texte_8',3,2),
    	(9,'2014/12/01 17:40','Titre_9','résumé_9','texte_9',1,1),
    	(10,'2013/08/18 01:57','Titre_10','résumé_10','texte_10',2,2),
    	(11,'2014/05/10 13:59','Titre_11','résumé_11','texte_11',2,2),
    	(12,'2013/11/26 07:55','Titre_12','résumé_12','texte_12',5,4),
    	(13,'2012/06/29 03:40','Titre_13','résumé_13','texte_13',5,1);
     
    INSERT INTO Categorie_article (cart_cat_id, cart_art_id)
    VALUES (3,1),(6,1),(1,2),(3,2),(6,2),(5,3),(6,3),(1,4),(3,5),(6,5),(1,6),(2,6),(1,7),(2,8),
    	(1,9),(2,9),(2,10),(3,10),(4,10),(2,11),(5,11),(6,11),(4,12),(5,12),(1,13),(6,13);
     
    INSERT INTO Utilisateur (id, pseudo, email, mot_passe)
    VALUES (1,'Beaudelaire','beaudelaire@mail.fr','G15VB'),
    	(2,'Hugo','hugo@mail.fr','1F6E3'),
    	(3,'Camus','camus@mail.fr','VBN45'),
    	(4,'Laclos','laclos@mail.fr','D365E'),
    	(5,'Flaubert','flaubert@mail.fr','H57HN'),
    	(6,'Saint-Exupéry','saint-exupéry@mail.fr','AAA11');
     
    INSERT INTO Commentaire (id, com_date, com_texte, com_art_id, com_util_id)
    VALUES (1,'2016/12/14 06:59','comm_1',12,1),
    	(2,'2014/09/02 11:41','comm_2',12,3),
    	(3,'2015/01/28 16:32','comm_3',1,3),
    	(4,'2016/03/29 00:03','comm_4',2,4),
    	(5,'2016/02/07 21:36','comm_5',2,6),
    	(6,'2016/12/22 10:33','comm_6',2,NULL);
     
     
    -- Requêtes d'extraction de données
    -- --------------------------------
    SELECT A.art_date AS date_article, A.titre AS titre
    	FROM Categorie_article AS CA
    	INNER JOIN Article AS A ON CA.cart_art_id = A.id
    	INNER JOIN Categorie AS C ON CA.cart_cat_id = C.id
    	WHERE C.nom = 'rouge'
    	ORDER BY date_article DESC;
    Tiens, je remarque un truc : il apparait des lignes vierges dans le CREATE TABLE Categorie_article qui n'existent pas dans le fichier texte qui me sert de brouillon.

    Merci. Cordialement - Antonin

  6. #6
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Ceci fonctionne sans problème

    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
            -- Effacer la base
            -- ---------------
            DROP DATABASE IF EXISTS mon_blog;
             
             
            -- Créer la base
            -- -------------
            CREATE DATABASE mon_blog CHARACTER SET 'utf8';
            USE mon_blog;
             
             
            -- Créer les tables
            -- ----------------
            CREATE TABLE Categorie
            	(id INT UNSIGNED AUTO_INCREMENT,
            	 nom VARCHAR(150) NOT NULL,
            	 description TINYTEXT NOT NULL,
            	PRIMARY KEY (id),
            	FULLTEXT ind_nom (nom(20))
            	)
            	ENGINE=INNODB;
             
            CREATE TABLE Article
            	(id INT UNSIGNED AUTO_INCREMENT,
            	 art_date DATETIME, 
            	 titre VARCHAR(40) NOT NULL,
            	 resume TINYTEXT NOT NULL,
            	 art_texte TEXT NOT NULL,
            	 art_util_id INT UNSIGNED NOT NULL,
            	 art_cat_id INT UNSIGNED NOT NULL,
            	PRIMARY KEY (id),
            	FULLTEXT ind_titre (titre),
    		CONSTRAINT fk_art_categorie_id FOREIGN KEY (art_cat_id) REFERENCES Categorie(id)
                    	)
            	ENGINE=INNODB;
             
            CREATE TABLE Categorie_article
            	(cart_art_id INT UNSIGNED NOT NULL,
             
            	 cart_cat_id INT UNSIGNED NOT NULL,
             
            	PRIMARY KEY (cart_art_id, cart_cat_id),
            CONSTRAINT fk_catart_article_id FOREIGN KEY (cart_art_id) REFERENCES Article(id),
            CONSTRAINT fk_catart_categorie_id FOREIGN KEY (cart_cat_id) REFERENCES Categorie(id)
             
            	)
            	ENGINE=INNODB;
             
                 
             
             
             
            -- Alimenter la base
            -- -----------------
            INSERT INTO Categorie (id, nom, description)
            VALUES (1,'Rouge','Soleil couchant'),
            	(2,'Orange','Fruit d''Espagne'),
            	(3,'Jaune','L''or en barre'),
            	(4,'Vert','Végétation au printemps'),
            	(5,'Bleu','Ciel du midi'),
            	(6,'Violet','Artichaut de Provence'),
            	(7,'Indigo','Pastel des teinturiers');
             
            INSERT INTO Article (id, art_date, titre, resume, art_texte, art_util_id, art_cat_id)
            VALUES (1,'2012/12/01 02:56','Titre_1','résumé_1','texte_1',1,3),
            	(2,'2014/03/10 17:01','Titre_2','résumé_2','texte_2',2,1),
            	(3,'2012/05/18 01:17','Titre_3','résumé_3','texte_3',3,5),
            	(4,'2014/08/13 22:14','Titre_4','résumé_4','texte_4',4,1),
            	(5,'2012/10/07 06:04','Titre_5','résumé_5','texte_5',5,3),
            	(6,'2013/05/05 12:56','Titre_6','résumé_6','texte_6',6,1),
            	(7,'2013/09/22 23:53','Titre_7','résumé_7','texte_7',6,1),
            	(8,'2013/02/04 05:42','Titre_8','résumé_8','texte_8',3,2),
            	(9,'2014/12/01 17:40','Titre_9','résumé_9','texte_9',1,1),
            	(10,'2013/08/18 01:57','Titre_10','résumé_10','texte_10',2,2),
            	(11,'2014/05/10 13:59','Titre_11','résumé_11','texte_11',2,2),
            	(12,'2013/11/26 07:55','Titre_12','résumé_12','texte_12',5,4),
            	(13,'2012/06/29 03:40','Titre_13','résumé_13','texte_13',5,1);
             
            INSERT INTO Categorie_article (cart_cat_id, cart_art_id)
            VALUES (3,1),(6,1),(1,2),(3,2),(6,2),(5,3),(6,3),(1,4),(3,5),(6,5),(1,6),(2,6),(1,7),(2,8),
            	(1,9),(2,9),(2,10),(3,10),(4,10),(2,11),(5,11),(6,11),(4,12),(5,12),(1,13),(6,13);
    puis un petit test de contraintes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    use mon_blog;
    INSERT INTO Categorie_article (cart_cat_id, cart_art_id)
            VALUES (23,1);
    =>
    MySQL a répondu: Documentation
    #1452 - Cannot add or update a child row: a foreign key constraint fails (`mon_blog`.`categorie_article`, CONSTRAINT `fk_catart_categorie_id` FOREIGN KEY (`cart_cat_id`) REFERENCES `categorie` (`id`))
    Donc tout baigne !?

  7. #7
    Membre à l'essai Avatar de GuyAntonin
    Homme Profil pro
    Bidouilleur informatique
    Inscrit en
    Décembre 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Bidouilleur informatique

    Informations forums :
    Inscription : Décembre 2016
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Bonsoir,

    Désolé, mais ça ne fonctionne pas. Ce qui ne m'étonne pas d'ailleurs puisque j'avais commencé comme ça. Voici le résultat de l'exécution :

    mysql> -- Créer les tables
    mysql> -- ----------------
    mysql> CREATE TABLE Categorie
    -> (id INT UNSIGNED AUTO_INCREMENT,
    -> nom VARCHAR(150) NOT NULL,
    -> description TINYTEXT NOT NULL,
    -> PRIMARY KEY (id),
    -> FULLTEXT ind_nom (nom(20))
    -> )
    -> ENGINE=INNODB;
    Query OK, 0 rows affected (0.15 sec)

    mysql>
    mysql> CREATE TABLE Article
    -> (id INT UNSIGNED AUTO_INCREMENT,
    -> art_date DATETIME,
    -> titre VARCHAR(40) NOT NULL,
    -> resume TINYTEXT NOT NULL,
    -> art_texte TEXT NOT NULL,
    -> art_util_id INT UNSIGNED NOT NULL,
    -> art_cat_id INT UNSIGNED NOT NULL,
    -> PRIMARY KEY (id),
    -> FULLTEXT ind_titre (titre),
    -> CONSTRAINT fk_art_utilisateur_id FOREIGN KEY (art_util_id) REFERENCES Utilisateur(id),
    -> CONSTRAINT fk_art_categorie_id FOREIGN KEY (art_cat_id) REFERENCES Categorie(id)
    -> )
    -> ENGINE=INNODB;
    ERROR 1215 (HY000): Cannot add foreign key constraint
    mysql>
    mysql> CREATE TABLE Categorie_article
    -> (cart_art_id INT UNSIGNED NOT NULL,
    -> cart_cat_id INT UNSIGNED NOT NULL,
    -> PRIMARY KEY (cart_art_id, cart_cat_id),
    -> CONSTRAINT fk_catart_article_id FOREIGN KEY (cart_art_id) REFERENCES Article(id),
    -> CONSTRAINT fk_catart_categorie_id FOREIGN KEY (cart_cat_id) REFERENCES Categorie(id)
    -> )
    -> ENGINE=INNODB;
    ERROR 1215 (HY000): Cannot add foreign key constraint
    mysql>
    mysql> CREATE TABLE Utilisateur
    -> (id INT UNSIGNED AUTO_INCREMENT,
    -> pseudo VARCHAR(40) NOT NULL,
    -> email VARCHAR(40) NOT NULL,
    -> mot_passe VARBINARY(16) NOT NULL,
    -> PRIMARY KEY (id),
    -> UNIQUE ind_uni_pseudo_email (pseudo, email),
    -> FULLTEXT ind_pseudo (pseudo(20))
    -> )
    -> ENGINE=INNODB;
    Query OK, 0 rows affected (0.15 sec)

    mysql>
    mysql> CREATE TABLE Commentaire
    -> (id INT UNSIGNED AUTO_INCREMENT,
    -> com_date DATETIME,
    -> com_texte TEXT NOT NULL,
    -> com_art_id INT UNSIGNED NOT NULL,
    -> com_util_id INT UNSIGNED,
    -> PRIMARY KEY (id),
    -> CONSTRAINT fk_comm_article_id FOREIGN KEY (com_art_id) REFERENCES Article(id),
    -> CONSTRAINT fk_comm_utilisateur_id FOREIGN KEY (com_util_id) REFERENCES Utilisateur(id)
    -> )
    -> ENGINE=INNODB;
    ERROR 1215 (HY000): Cannot add foreign key constraint
    mysql>
    Cordialement - Antonin

  8. #8
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Quelle est la version mysql ?
    Moi en local c'est 5.7.11 ...

  9. #9
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Je pense avoir trouvé et compris ton erreur ,
    donc essaye ça et on en rediscute ...

    [EDIT] Tu noteras que les "create" des tables et les "insert" ont été un peu changé de place et ça change tout !


    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
     
     
    -- ---------------
    DROP DATABASE IF EXISTS mon_blog;
     
     
    -- Créer la base
    -- -------------
    CREATE DATABASE mon_blog CHARACTER SET 'utf8';
    USE mon_blog;
     
     
    -- Créer les tables
    -- ----------------
     
    CREATE TABLE Utilisateur
    	(id INT UNSIGNED AUTO_INCREMENT,
    	 pseudo VARCHAR(40) NOT NULL,
    	 email VARCHAR(40) NOT NULL,
    	 mot_passe VARBINARY(16) NOT NULL,
    	PRIMARY KEY (id),
    	UNIQUE ind_uni_pseudo_email (pseudo, email),
    	FULLTEXT ind_pseudo (pseudo(20))
    	)
    	ENGINE=INNODB;
     
    CREATE TABLE Categorie
    	(id INT UNSIGNED AUTO_INCREMENT,
    	 nom VARCHAR(150) NOT NULL,
    	 description TINYTEXT NOT NULL,
    	PRIMARY KEY (id),
    	FULLTEXT ind_nom (nom(20))
    	)
    	ENGINE=INNODB;
     
    CREATE TABLE Article
    	(id INT UNSIGNED AUTO_INCREMENT,
    	 art_date DATETIME, 
    	 titre VARCHAR(40) NOT NULL,
    	 resume TINYTEXT NOT NULL,
    	 art_texte TEXT NOT NULL,
    	 art_util_id INT UNSIGNED NOT NULL,
    	 art_cat_id INT UNSIGNED NOT NULL,
    	PRIMARY KEY (id),
    	FULLTEXT ind_titre (titre),
    	CONSTRAINT fk_art_utilisateur_id FOREIGN KEY (art_util_id) REFERENCES Utilisateur(id),
    	CONSTRAINT fk_art_categorie_id FOREIGN KEY (art_cat_id) REFERENCES Categorie(id)
     
     
    	)
    	ENGINE=INNODB;
     
    CREATE TABLE Categorie_article
    	(cart_art_id INT UNSIGNED NOT NULL,
     
    	 cart_cat_id INT UNSIGNED NOT NULL,
     
    	PRIMARY KEY (cart_art_id, cart_cat_id),
    CONSTRAINT fk_catart_article_id FOREIGN KEY (cart_art_id) REFERENCES Article(id),
    CONSTRAINT fk_catart_categorie_id FOREIGN KEY (cart_cat_id) REFERENCES Categorie(id)
     
     
    	)
    	ENGINE=INNODB;
     
     
     
    CREATE TABLE Commentaire
    	(id INT UNSIGNED AUTO_INCREMENT,
    	 com_date DATETIME, 
    	 com_texte TEXT NOT NULL,
    	 com_art_id INT UNSIGNED NOT NULL,
    	 com_util_id INT UNSIGNED,
    	PRIMARY KEY (id),
    	CONSTRAINT fk_comm_article_id FOREIGN KEY (com_art_id) REFERENCES Article(id),
    	CONSTRAINT fk_comm_utilisateur_id FOREIGN KEY (com_util_id) REFERENCES Utilisateur(id)
     
     
    	)
    	ENGINE=INNODB;
     
     
    -- Alimenter la base
    -- -----------------
    INSERT INTO Utilisateur (id, pseudo, email, mot_passe)
    VALUES (1,'Beaudelaire','beaudelaire@mail.fr','G15VB'),
    	(2,'Hugo','hugo@mail.fr','1F6E3'),
    	(3,'Camus','camus@mail.fr','VBN45'),
    	(4,'Laclos','laclos@mail.fr','D365E'),
    	(5,'Flaubert','flaubert@mail.fr','H57HN'),
    	(6,'Saint-Exupéry','saint-exupéry@mail.fr','AAA11');
     
    INSERT INTO Categorie (id, nom, description)
    VALUES (1,'Rouge','Soleil couchant'),
    	(2,'Orange','Fruit d''Espagne'),
    	(3,'Jaune','L''or en barre'),
    	(4,'Vert','Végétation au printemps'),
    	(5,'Bleu','Ciel du midi'),
    	(6,'Violet','Artichaut de Provence'),
    	(7,'Indigo','Pastel des teinturiers');
     
    INSERT INTO Article (id, art_date, titre, resume, art_texte, art_util_id, art_cat_id)
    VALUES (1,'2012/12/01 02:56','Titre_1','résumé_1','texte_1',1,3),
    	(2,'2014/03/10 17:01','Titre_2','résumé_2','texte_2',2,1),
    	(3,'2012/05/18 01:17','Titre_3','résumé_3','texte_3',3,5),
    	(4,'2014/08/13 22:14','Titre_4','résumé_4','texte_4',4,1),
    	(5,'2012/10/07 06:04','Titre_5','résumé_5','texte_5',5,3),
    	(6,'2013/05/05 12:56','Titre_6','résumé_6','texte_6',6,1),
    	(7,'2013/09/22 23:53','Titre_7','résumé_7','texte_7',6,1),
    	(8,'2013/02/04 05:42','Titre_8','résumé_8','texte_8',3,2),
    	(9,'2014/12/01 17:40','Titre_9','résumé_9','texte_9',1,1),
    	(10,'2013/08/18 01:57','Titre_10','résumé_10','texte_10',2,2),
    	(11,'2014/05/10 13:59','Titre_11','résumé_11','texte_11',2,2),
    	(12,'2013/11/26 07:55','Titre_12','résumé_12','texte_12',5,4),
    	(13,'2012/06/29 03:40','Titre_13','résumé_13','texte_13',5,1);
     
    INSERT INTO Categorie_article (cart_cat_id, cart_art_id)
    VALUES (3,1),(6,1),(1,2),(3,2),(6,2),(5,3),(6,3),(1,4),(3,5),(6,5),(1,6),(2,6),(1,7),(2,8),
    	(1,9),(2,9),(2,10),(3,10),(4,10),(2,11),(5,11),(6,11),(4,12),(5,12),(1,13),(6,13);
     
     
    INSERT INTO Commentaire (id, com_date, com_texte, com_art_id, com_util_id)
    VALUES (1,'2016/12/14 06:59','comm_1',12,1),
    	(2,'2014/09/02 11:41','comm_2',12,3),
    	(3,'2015/01/28 16:32','comm_3',1,3),
    	(4,'2016/03/29 00:03','comm_4',2,4),
    	(5,'2016/02/07 21:36','comm_5',2,6),
    	(6,'2016/12/22 10:33','comm_6',2,NULL);
     
     
    -- Requêtes d'extraction de données
    -- --------------------------------
    SELECT A.art_date AS date_article, A.titre AS titre
    	FROM Categorie_article AS CA
    	INNER JOIN Article AS A ON CA.cart_art_id = A.id
    	INNER JOIN Categorie AS C ON CA.cart_cat_id = C.id
    	WHERE C.nom = 'rouge'
    	ORDER BY date_article DESC;

  10. #10
    Membre à l'essai Avatar de GuyAntonin
    Homme Profil pro
    Bidouilleur informatique
    Inscrit en
    Décembre 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Bidouilleur informatique

    Informations forums :
    Inscription : Décembre 2016
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    La version complète, je ne sais pas. Mais le répertoire d'install est C:\Program Files\MySQL\MySQL Server 5.7\bin\
    et je l'ai téléchargé il y a 1 mois. Donc je dois avoir la même que la tienne.

    Tiens, au fait, comment tu fais pour avoir la version complète. Il doit bien y avoir une commande pour ça ?

    Antonin

  11. #11
    Membre à l'essai Avatar de GuyAntonin
    Homme Profil pro
    Bidouilleur informatique
    Inscrit en
    Décembre 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Bidouilleur informatique

    Informations forums :
    Inscription : Décembre 2016
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Oui, ça aussi je l'avais fait. Mais alors, l'alimentation des tables Article, Categorie_article, Commentaire, donnent l'erreur :

    mysql> INSERT INTO Categorie_article (cart_cat_id, cart_art_id)
    -> VALUES (3,1),(6,1),(1,2),(3,2),(6,2),(5,3),(6,3),(1,4),(3,5),(6,5),(1,6),(2,6),(1,7),(2,8),
    -> (1,9),(2,9),(2,10),(3,10),(4,10),(2,11),(5,11),(6,11),(4,12),(5,12),(1,13),(6,13);
    ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`mon_blog`.`categorie_article`, CONSTRAINT `fk_catart_article_id` FOREIGN KEY (`cart_art_id`) REFERENCES `article` (`id`))
    mysql>
    Antonin

  12. #12
    Membre à l'essai Avatar de GuyAntonin
    Homme Profil pro
    Bidouilleur informatique
    Inscrit en
    Décembre 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Bidouilleur informatique

    Informations forums :
    Inscription : Décembre 2016
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Stoooop ! Attends, je contrôle un truc ...

  13. #13
    Membre à l'essai Avatar de GuyAntonin
    Homme Profil pro
    Bidouilleur informatique
    Inscrit en
    Décembre 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Bidouilleur informatique

    Informations forums :
    Inscription : Décembre 2016
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Bingo !!!

    Conclusion :
    1 - créer d'abord la table qui contient la référence d'une clé étrangère PUIS créer la table qui contient la clé étrangère. Ce qui est on ne peut plus logique car sinon la clé pédale dans le vide !
    2 - alimenter les tables dans le même ordre car MySQL contrôle que la valeur de la clé étrangère est bien compatible avec la référence. Donc si la référence n'existe pas encore ... même motif, même punition !

    "Blaireau des îles" que je suis ! Avec un peu de logique et de réflexion j'aurais pu trouver ça comme un grand.

    En tout cas, merci beaucoup et au plaisir.
    Cordialement - Antonin

  14. #14
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Benh voilà

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/02/2016, 18h33
  2. Réponses: 11
    Dernier message: 07/01/2013, 22h45
  3. ensemble de clé étrangères uniques table intermédiaire
    Par Karly dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 01/08/2012, 20h49
  4. Mapping dans un table plusieurs-plusieurs-plusieurs
    Par Invité dans le forum Hibernate
    Réponses: 0
    Dernier message: 03/07/2009, 13h15
  5. [phpMyAdmin] Clef étrangères sur table d'association
    Par Le Lapin Nesquik dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 24/02/2009, 09h22

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