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 :

[INNODB] Fusion clé primaire


Sujet :

Requêtes MySQL

  1. #1
    gmc
    gmc est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 40
    Points : 33
    Points
    33
    Par défaut [INNODB] Fusion clé primaire
    [INNODB] Fusion clé primaire

    J'ai un problème à vous soumettre.
    J'ai 1 table A qui possède 3 enregistrements, avec une clé primaire dont les valeurs sont : 1, 2 et 3

    Cette table A est liée aux tables B, C, D, E, ...
    Avec dans chacune d'elle la clé étrangère, avec comme valeur 1, 2 ou 3.

    Les liasons INNODB entre ces tables sont :
    ON DELETE SET NULL
    ON UPDATE CASADE

    Je souhaite remplacer dans ma table A, la valeur 3 par la valeur 1.
    Comme ceci, dans les tables liées, il n'y aura que des "1" et plus de "3".

    Mais comment faire ?? sans faire de update dans chacune des tables ??
    Je ne peux pas faire de simple "UPDATE tableA SET champsClePrimaire = 1 where champsClePrimaire = 3", car on ne peut pas avoir 2 fois la meme clé primaire ... logique... mais quelle est la solution ??

    Merci de vos retours d'expériences

  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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Bonsoir,

    Tu écris d'une part :
    J'ai 1 table A qui possède 3 enregistrements, avec une clé primaire dont les valeurs sont : 1, 2 et 3
    Et d'autre part :
    Je souhaite remplacer dans ma table A, la valeur 3 par la valeur 1.
    Si tu remplaces 3 par 1, tu auras deux fois la valeur 1 pour la clé primaire, ce qui est impossible puisque par définition celle-ci est un index de type UNIQUE.

    Au fait, pourquoi veux-tu changer la valeur de la clé primaire ?
    En principe c'est quelque chose qu'on ne fait jamais.
    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
    gmc
    gmc est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    C est bien ce que je veux faire. En fait, l'objectif est de corriger des doublons de données dans la table.

    Imaginons qu'il y ai comme donnée :

    1 : Pomme
    2 : Poire
    3 : Pommme


    Et donc, que la donnée "Pommme" qui est une faute d'orthographe, et donc créé un doublon dans ma BDD. JE veux la "fusionner" avec "1 : Pomme".
    Et me servir du "UPDATE ON CASCADE de l'INNODB" pour que cette modification soit propagée sur toutes les autres tables. Sans faire des requêtes du style :

    "UPDATE tableB set fruitID = 1 WHERE fruitID = 3"
    "UPDATE tableC set fruitID = 1 WHERE fruitID = 3"
    "UPDATE tableD set fruitID = 1 WHERE fruitID = 3"
    "UPDATE tableE set fruitID = 1 WHERE fruitID = 3"
    "UPDATE tableF set fruitID = 1 WHERE fruitID = 3"

    Voyez vous ce que je souhaite faire ?

  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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je vois ce que vous souhaitez faire mais c'est impossible tel que vous envisagez car 3 ne peut pas être transformé en 1 dans la clé primaire puisque 1 existe déjà.

    En gros, vous souhaitez supprimer les doublons dans la table de référence.
    Comme vous avez mis :
    Si vous supprimez le doublon 3, les clés étrangères correspondantes vont se retrouver à NULL. Au fait, le NULL est-il autorisé pour la clé étrangère ?

    Je crains malheureusement que dans ce cas il vous faille procéder par requêtes directement sur les tables à 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
    gmc
    gmc est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    Merci pour vos commentaires.

    Oui, les valeurs NULL sont autorisés pour les clés étrangères.
    Cela va se produire sur l'action
    Mais j'espère trouvé une solution à mon problème, car je trouve dommage de faire X requêtes par tables. Surtout quand la BDD à des liaisons !

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Malheureusement, il n'y a pas de solution directe en SQL (en tout cas, pas à ma connaissance), dans la mesure où une clef étrangère d'une table pointe sur une clef primaire d'une autre table...
    Comme le dit Cinephil, impossible de mettre à jour la clef primaire avec une valeur déjà existante, et la suppression entraîne la mise à NULL de la clef étrangère (les autres options étant la suppression des lignes en cascade, mais ça il n'en est pas question ici (CASCADE), ou alors l'interdiction de suppression de la clef primaire (RESTRICT)).

    Il faut donc passer sur toutes les tables...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Tu peux utiliser information_schema pour créer une procédure qui mettra à jour les différentes tables B, C, D ... concernées par la FK en question.
    Citation Envoyé par gmc Voir le message
    je trouve dommage de faire X requêtes par tables. Surtout quand la BDD à des liaisons !
    Ces liasons sont utiles pour l'intégrité référentielle, et non pour mettre à jour des PK FK plus facilement, car comme l'a dit cinephil, mettre à jour une PK en principe ça n'arrive jamais.
    D'ailleurs chez certains éditeurs le ON UPDATE CASCADE n'existe même pas.

Discussions similaires

  1. [XL-2007] Fusion de classeur différent avec clé primaire
    Par FewRa dans le forum Excel
    Réponses: 3
    Dernier message: 13/06/2013, 13h46
  2. Réponses: 1
    Dernier message: 21/10/2009, 16h26
  3. Procédure stocké:Insert et renvoie de la clé primair
    Par caramel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/04/2003, 09h34
  4. Problème pour récupérer la clé primaire
    Par caramel dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/04/2003, 13h57
  5. Tri par fusion d'un tableau
    Par Mailgifson dans le forum C
    Réponses: 5
    Dernier message: 12/12/2002, 14h53

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