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 :

Problème de clé étrangère lors de la suppression


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web et Mobile
    Inscrit en
    Juin 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web et Mobile

    Informations forums :
    Inscription : Juin 2010
    Messages : 76
    Par défaut Problème de clé étrangère lors de la suppression
    Bonjour à tous,

    Après quelques recherches sur le net, je viens vers vous car je n'arrive à trouver de solution:

    J'ai donc 3 tables : utilisateurs, systemes, planetes.

    utilisateurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE `utilisateurs` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `pseudo` varchar(16) NOT NULL,
      `password` varchar(128) NOT NULL,
      `naissance` date DEFAULT NULL,
      `ip_inscription` varchar(32) NOT NULL,
      `statut` varchar(32) NOT NULL,
      `genre` varchar(32) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1;
    systemes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE `test_systemes` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `coordonnees` varchar(16) NOT NULL,
      `nb_planetes` int(5) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1;
    planetes :
    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
    CREATE TABLE `test_planetes` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `id_systeme` int(11) NOT NULL,
      `id_joueur` int(11) DEFAULT NULL,
      `taux_fer` int(3) NOT NULL,
      `taux_cuivre` int(3) NOT NULL,
      `taux_carbone` int(3) NOT NULL,
      `taux_hydrogene` int(3) NOT NULL,
      `taux_zinc` int(3) NOT NULL,
      `taux_plomb` int(3) NOT NULL,
      `taux_platine` int(3) NOT NULL,
      `taux_francium` int(3) NOT NULL,
      `taux_iode` int(3) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `id_joueur` (`id_joueur`),
      KEY `id_systeme` (`id_systeme`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1;
     
    ALTER TABLE `test_planetes`
      ADD CONSTRAINT `test_planetes_ibfk_2` FOREIGN KEY (`id_joueur`) REFERENCES `utilisateurs` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
      ADD CONSTRAINT `test_planetes_ibfk_1` FOREIGN KEY (`id_systeme`) REFERENCES `test_systemes` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
    Donc mon but est de pouvoir supprimer un utilisateur qui a une planète sans supprimer la planète et donc de mettre dans planetes.id_joueur = NULL.

    Hors je n'y arrive pas, j'ai ce message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1451 - Cannot delete or update a parent row: a foreign key constraint fails (`genesisegame`.`test_planetes`, CONSTRAINT `test_planetes_ibfk_2` FOREIGN KEY (`id_joueur`) REFERENCES `utilisateurs` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
    Merci d'avance pour vos réponses.
    Cordialement, Maxime.

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 254
    Par défaut
    Vérifie les contraintes sur ta clé étrangère utilisateur dans la table planète. La contrainte montrée dans le message d'erreur indique de ne rien faire en cas de suppression de 'utilisateur dans la table utilisateur et empêche donc la suppression. Elle ne correspond pas à la contrainte que tu nous montre dans ton code SQL. Tu as peut-être une contrainte cachée, ou la modification de la contrainte par ton code ne se fait pas.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web et Mobile
    Inscrit en
    Juin 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web et Mobile

    Informations forums :
    Inscription : Juin 2010
    Messages : 76
    Par défaut
    Justement je ne comprend pas. J'ai mis que je voulais qu'il mette NULL quand l'utilisateur est supprimer.

    planètes :
    id_joueur ->`ma_bdd`.`utilisateurs`.`id` ON DELETE SET NULL ON UPDATE CASCADE

    Bizarre, bon si çà ne marche pas tant pis, je ferai en PHP directement.

  4. #4
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut,

    déjà tu n'as pas besoin d'écrire les clés étrangères à l'extérieur des tables ni de créer un index sur elles, elles sont auto indexée en innodb normalement...

    ça simplifie la lecture de ton code et sa maintenance...

    après, comme te dit sevyc64, regarde les contrainte de cascade ("on cascade") que tu veux mettre su ta colonne. par défaut, il me semble que ça déclenche le delete en cascade...

    au pire la solution c'est de ne pas définir la colonne comme une clé étrangère et de juste l'indexer...

    si tu utilise defaukt alors il me semble que pour mysql c'est comme si tu précisais que ta colonne est "not null" vu que tu fixe une valeur par défaut (même si ici c'est null)

Discussions similaires

  1. [XL-2000] Problème temps d'exécution lors de la suppression d'enregistrement
    Par juju05 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/12/2011, 14h01
  2. Problème avec les formules lors de la suppression d'une colonne
    Par justgreat dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/08/2010, 12h19
  3. Problème lors de la suppression de lignes
    Par Tintou dans le forum Langage SQL
    Réponses: 7
    Dernier message: 04/07/2007, 09h09
  4. Réponses: 5
    Dernier message: 01/06/2007, 10h04
  5. [JDOM] Problème d'iterateur lors d'une suppression
    Par romuluslepunk dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 07/01/2006, 15h00

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