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 :

#1452 Erreur MySQL [MySQL-5.7]


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 13
    Points : 7
    Points
    7
    Par défaut #1452 Erreur MySQL
    Bonjour j'aurais besoin d'aide concernant une clé étrangère que j'essaye d'insérer dans ma base de donnée.
    Avec une table clients et une table abonnements, j'essaye de faire une clé étrangère avec code_client (de la table abonnements) avec id_clients (qui est la clé primaire de la table clients)
    Pour faire ma clé étrangère j'utilise la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE abonnements
    ADD INDEX(code_client),
    ADD FOREIGN KEY (code_client) REFERENCES clients (id_clients) ;
    Le problème, c'est qu'il me met l'erreur suivante :
    #1452 - Cannot add or update a child row: a foreign key constraint fails (`btssio`.`#sql-16a8_21b`, CONSTRAINT `#sql-16a8_21b_ibfk_1` FOREIGN KEY (`code_client`) REFERENCES `clients` (`id_clients`))
    ça fait des jours que je cherche des solutions mais rien ne fonctionne. je suis débutant dans la matière et c'est un devoir que j'ai à rendre bientôt...
    Merci d'avance pour votre aide,
    Cordialement.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Le message d'erreur est clair : MySQL ne peut pas créer la clé étrangère parce que cette création entraîne une absence de référence sur les données existantes.
    En l'occurrence, vous avez probablement au moins une ligne de la table abonnements qui ne contient pas un code_client existant dans la table clients.

    Cherchez quelles sont ces lignes, renseignez-y le code_client correctement ou supprimez les si ce sont des données mortes puis recommencez la création de votre clé étrangère.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Merci pour votre réponse,

    j'ai réussis mais que avec ma clé primaire 'id' de 'abonnements' je vous envois un DUMB parce que je ne comprend pas pourquoi cela marche avec 'id' et pas code_client.

    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
    -- phpMyAdmin SQL Dump
    -- version 4.7.4
    -- <a href="https://www.phpmyadmin.net/" target="_blank">https://www.phpmyadmin.net/</a>
    --
    -- Hôte : 127.0.0.1:3306
    -- Généré le :  lun. 16 oct. 2017 à 07:09
    -- Version du serveur :  5.7.19
    -- Version de PHP :  5.6.31
     
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET AUTOCOMMIT = 0;
    START TRANSACTION;
    SET time_zone = "+00:00";
     
     
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8mb4 */;
     
    --
    -- Base de données :  `btssio`
    --
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `abonnements`
    --
     
    DROP TABLE IF EXISTS `abonnements`;
    CREATE TABLE IF NOT EXISTS `abonnements` (
      `prix` tinyint(20) DEFAULT NULL,
      `date_debut` datetime DEFAULT NULL,
      `date_fin` datetime DEFAULT NULL,
      `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
     
    --
    -- Déchargement des données de la table `abonnements`
    --
     
    INSERT INTO `abonnements` (`prix`, `date_debut`, `date_fin`, `id`) VALUES
    (10, '2017-10-12 00:00:00', '2018-10-12 00:00:00', 1),
    (10, '2017-02-22 00:00:00', '2018-02-22 00:00:00', 2);
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `clients`
    --
     
    DROP TABLE IF EXISTS `clients`;
    CREATE TABLE IF NOT EXISTS `clients` (
      `id_clients` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      `nom` varchar(50) DEFAULT NULL,
      `prenom` varchar(50) DEFAULT NULL,
      `age` tinyint(20) DEFAULT NULL,
      `adresse` tinytext,
      `numéros_clients` varchar(50) DEFAULT NULL,
      PRIMARY KEY (`id_clients`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
     
    --
    -- Déchargement des données de la table `clients`
    --
     
    INSERT INTO `clients` (`id_clients`, `nom`, `prenom`, `age`, `adresse`, `numéros_clients`) VALUES
    (1, 'Rebecca', 'ARMAND', 25, '11 rue des veterans', '01'),
    (2, 'Doe', 'John', 45, '58 rue routier grandval', '02'),
    (3, 'Jean', 'Kevin', 52, '12 chemin de azalees', '03'),
    (4, 'Ulant', 'Charles', 15, '35 chemin des mirtilles', '04'),
    (5, 'Mailleul', 'Christophe', 29, '15 rue des coquelicots', '05');
     
    --
    -- Contraintes pour les tables déchargées
    --
     
    --
    -- Contraintes pour la table `abonnements`
    --
    ALTER TABLE `abonnements`
      ADD CONSTRAINT `abonnements_ibfk_1` FOREIGN KEY (`id`) REFERENCES `clients` (`id_clients`) ON UPDATE CASCADE;
    COMMIT;
     
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    Merci d'avance,
    Cordialement.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    --
    -- Structure de la table `abonnements`
    --
     
    DROP TABLE IF EXISTS `abonnements`;
    CREATE TABLE IF NOT EXISTS `abonnements` (
    `prix` tinyint(20) DEFAULT NULL,
    `date_debut` datetime DEFAULT NULL,
    `date_fin` datetime DEFAULT NULL,
    `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
    Vous avez là une clé primaire auto-incrémentée qui identifie chaque abonnement mais pas de colonne qui permettrait de signifier à quel client se rattache l'abonnement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE `abonnements`
    ADD CONSTRAINT `abonnements_ibfk_1` FOREIGN KEY (`id`) REFERENCES `clients` (`id_clients`) ON UPDATE CASCADE;
    Et là vous voulez faire de cette clé auto-incrémentée identifiant l'abonnement une clé étrangère référençant le client.

    Il vous faut :
    1) ajouter, dans la table abonnements, une colonne id_client ;
    2) modifier les données de la table abonnements pour y mettre la bonne valeur dans la colonne id_client ;
    3) créer votre contrainte de clé étrangère.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    En fait le champ code_client, je l'avais supprimé quand le ''id" fonctionnait
    le code_client était un TINYINT(50).

    Mais je pense avoir ciblé le problème quand j'ai peuplé ce champ ils étaient tous en 0 c'est à dire que je pensais que la étrangère allait faire le liens tout seul (je crois au père noël surement xD) on appel ça donnée morte si j'ai bien compris ce que vous m'avez dit ?

    Cordialement

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Comment MySQL pourrait-il savoir à quel client rattacher tel abonnement ?

    Je pensais au départ que vous ajoutiez une contrainte de clé étrangère sur une colonne déjà existante dans une base de données déjà remplie. Une donnée morte est justement une donnée inutilisable du fait de son non rattachement aux autres. Dans le cas présent, il s'agirait d'une ligne d'abonnement qui ne ferait pas référence à un client ou qui ferait référence à un client qui n'existe pas. Il est possible d'avoir des données mortes quand la base de données est mal modélisée et/ou mise en oeuvre, notamment à cause de l'absence des clés étrangères.

    Avec la clé étrangère, si vous essayez d'ajouter un abonnement sans faire référence à un client existant, MySQL refusera d'enregistrer la ligne. Sans clé étrangère, MySQL l'acceptera puisqu'il ne connait pas l'association entre la table des abonnements et celle des clients.

    Au passage, nommez vos tables au singulier car elles sont issues des entités types du MCD, elles mêmes issues des règles de gestion qui décrivent ce qui se passe successivement pour 1 instance de chaque entité type.

    Dans votre cas, vous avez la règle de gestion suivante :
    Un abonnement appartient à un seul client et un client peut avoir plusieurs abonnements.

    MCD :
    Client -0,n----avoir----1,1- Abonnement

    Il faut donc bien une clé étrangère dans la table des abonnements pour y référencer le client propriétaire de l'abonnement.
    client (cli_id, cli_nom...)
    abonnement (abn_id, abn_id_client, abn_date_debut, abn_date_fin...)
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Je vous remercie infiniment pour vos réponses !
    Je suis débutant en la matière comme vous pouvez le constater, c'est un devoir que je dois fournir en bts SIO.
    Notre formateur veut qu'on se débrouille tout seul grâce à internet et vous me sauvez la vie, car je ne comprenais pas

    PS : Je vais de ce pas mettre tout ceci au singulier

    Cordialement,

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Alors pour en apprendre un peu plus sur la conception et la mise en oeuvre des bases de données relationnelles, je te propose deux de mes billets de blog :
    1) Comment bien écrire ses règles de gestion pour modéliser plus facilement sa future base de données
    2) Quand faut-il créer une table associative (et quand ne le faut-il pas) dans la base de données ? Quelles sont les clés étrangères à mettre en oeuvre ?

    Enfin, il y a de bons tutoriels sur la modélisation des bases de données et une foule de choses pour bien apprendre le SQL chez SQLPro.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Votre blog est super ! je vais de ce pas le montrer à mes collègues de classes merci beaucoup !

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Merci. Les articles dont j'ai donné les liens sont sur l'ancien blog. Il y en a quelques uns sur le nouveau mais grand chose encore concernant les bases de données.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Ok ça marche !

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

Discussions similaires

  1. [phpMyAdmin] erreur MySQL 1452
    Par Spellbinder dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 06/06/2010, 13h00
  2. erreur mysql Unknown column...
    Par italiasky dans le forum Requêtes
    Réponses: 9
    Dernier message: 08/02/2006, 10h26
  3. erreur mysql... probleme de requete
    Par om.rava dans le forum Requêtes
    Réponses: 5
    Dernier message: 07/12/2005, 21h48
  4. avoir les log d'erreur mysql
    Par simoryl dans le forum Administration
    Réponses: 4
    Dernier message: 06/09/2005, 14h24

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