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

Administration MySQL Discussion :

mettre une clé étrangère faisant partie d'une clé primaire à null on delete


Sujet :

Administration MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Géomaticien
    Inscrit en
    Juillet 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Juillet 2013
    Messages : 48
    Points : 36
    Points
    36
    Par défaut mettre une clé étrangère faisant partie d'une clé primaire à null on delete
    Bonjour,

    Ma question porte sur une table de jointure comportant deux clés étrangères dont le couple constitue une clé primaire. Ces deux clés étrangères pointent respectivement vers une table de membres et une table d'emplois. Chaque membre peut avoir plusieurs emplois différents mais le même membre ne peut pas avoir deux fois exactement le même emploi.

    Ma question concerne ce qu'il se passe lorsqu'on supprime un emploi. Je veux conserver mon membre, donc mettre la clé étrangère de l'emploi à null. Or comme cette clé étrangère fait partie d'une clé primaire, MySQL m'interdis de le faire.

    Comment puis-je parvenir à mes fins ? Si j'enlève la clé primaire, j'autoriserai dans la base qu'un même membre puisse avoir plusieurs fois le même emploi, ce que je ne veux pas, et si je garde la clé primaire, je ne peux pas supprimer d'emploi concernant un membre.

    Bref, je bloque.

    Si quelqu'un a un éclairage, ça m'intéresse,

    A+

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Tu as donc 3 tables, la table membre, la table emploi, et la table association entre membre et emploi (ce que tu appelle table de jointure).

    Si tu supprime un emploi (le démarche serait la même pour un membre), tu dois d'abords supprimer l'association entre le membre et l'emploi.

    Tu ne touche pas à la table membre, ton membre reste. Par contre tu dois supprimer la(les) ligne(s) complète(s) dans la table association correspondant à l'emploi que tu veux supprimer, et ce pour n'importe quel membre. Ensuite seulement tu pourra supprimer la ligne dans la table emploi.

    Une clé primaire ne peut pas être nulle. Une clé primaire composée de plusieurs champs, si on de ces champs est nul, doit* être considéré comme nulle et donc ce n'est pas possible.

    * doit parce que, si la plupart des SGBD doivent bloquer ce cas, il doit bien y en avoir de trop permissif qui l'autorise.Ce qui ne faut pas.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Géomaticien
    Inscrit en
    Juillet 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Juillet 2013
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    Merci sevyc64 pour cette réponse rapide.

    ça marche bien dans MySQL ainsi.

    Si je résume, lorsque j'appuierai sur un bouton "supprimer emploi" sur mon site, il faudra faire appel dans mon controller à deux requêtes SQL de suppression. La première sur l'association en ayant récupéré les deux id en clause where, celle du membre et de l'emploi en question, puis une seconde requête sur la table emploi avec l'id de l'emploi en clause where.

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Oui, à un détail près pour la première requête : Ce n'est pas "l'association en ayant récupéré les deux id en clause where" mais "toutes les associations ayant pour second id, l'id de l'emploi supprimé".

    Si tu supprime un emploi, celui-ci n'existe plus. Plus aucun membre ne peut avoir cet emploi, et pas uniquement celui remonté dans ta clause.
    D'ailleurs si ta base est correctement concue, le sgbd ne doit pas te laisser supprimer un emploi si son id est encore utilisé dans une clé étrangère quelque part.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Géomaticien
    Inscrit en
    Juillet 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Juillet 2013
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    Ok, bien pigé, c'est fastidieux mais j'ai compris , merci pour les explications !

    Du coup, pour toutes mes associations many to many, je me retrouve à mettre des contraintes de type ON DELETE RESTRICT et ON UPDATE CASCADE. Quand peut-on donc utiliser le SET NULL ? En effet, dans des associations many to many, on aura toujours une clé primaire composée de deux clés étrangères qui refuseront d'être mises à NULL. On ne peut utiliser le SET NULL que pour des relations ONE to MANY ?

Discussions similaires

  1. Extraire un élément faisant partie d'une variable dans une regexp
    Par byrdo dans le forum Programmation et administration système
    Réponses: 9
    Dernier message: 17/04/2009, 15h21
  2. afficher une message box a parti d'une console
    Par lermit dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 14/05/2007, 15h18
  3. [RegEx] Remplacer partie d'une chaîne par le résultat d'une fonction
    Par SCalc dans le forum Langage
    Réponses: 5
    Dernier message: 15/02/2007, 09h41
  4. Réponses: 5
    Dernier message: 28/08/2006, 18h11

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