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 :

update et order by sur tables jointes avec une clé étrangère


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 145
    Points
    145
    Par défaut update et order by sur tables jointes avec une clé étrangère
    Bonjour,

    Mon problème concerne des updates de ma base :
    - des tables liées entre elles par des left join, avec une clé principale, définies par une foreign key en InnoDB

    La doc est claire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE tableunique SET cequonveut ORDER BY ma_cle
    ou alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE tableprincipale AS t1
    LEFT JOIN t2 ON t1.cle = t2.id
    LEFT JOIN t3. etc.
    SET t1.ma_cle = t1.ma_cle + 999, t2.id = t2.id + 999, t3.id = t3.id + 999
    ... mais sans ORDER BY

    Mon problème, c'est qu'il me faut faire l'update dans un certain ordre pour éviter les doublons de clés (ex : si j'ai 5.000 enregistrements, auxquels on va rajouter 999, il faut que je commence par le 5.000, puis que je descende)

    Si vous avez des idées, merci

    (pour mémoire : doc mysql : update)

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 145
    Points
    145
    Par défaut
    J'ai pensé créer une table temporaire qui elle reprendrait dans l'ordre tous les index et les clés primaires, en y ajoutant le nombre d'enregistrements (pour éviter les doublons sur les clés primaires), mais ça ne marche toujours pas

    J'obtiens une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cannot delete or update a parent row: a foreign key constraint fails
    Pourtant mon code semble ok :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE `demo_art` AS t0 
    LEFT JOIN `tempo` AS t1 ON t1.`cle_deb` = t0.`cle_art` 
    LEFT JOIN `demo_art_lk_facult` AS t2 ON t2.`id_art` = t0.`cle_art` 
    LEFT JOIN `demo_art_lk_facult` AS t3 ON t3.`id_art_cible` = t0.`cle_art` 
    LEFT JOIN `demo_art_lk_oblig` AS t4 ON t4.`id_art` = t0.`cle_art` 
    LEFT JOIN `demo_art_lk_oblig` AS t5 ON t5.`id_art_cible` = t0.`cle_art` 
    LEFT JOIN `demo_ctx` AS t6 ON t6.`var` = 'id_art' AND t6.`val` = t0.`cle_art` 
    LEFT JOIN `demo_lk` AS t7 ON t7.`champ_cle` = 'cle_art' AND t7.`val` = t0.`cle_art` 
    SET t0.`cle_art` = t1.`cle_fin` + 14, t0.`cle_ferm` = t1.`ferm_fin` + 14, t2.`id_art` = t1.`cle_fin` + 14 , t3.`id_art_cible` = t1.`cle_fin` + 14 , t4.`id_art` = t1.`cle_fin` + 14 , t5.`id_art_cible` = t1.`cle_fin` + 14 , t6.`val` = t1.`cle_fin` + 14, t7.`val` = t1.`cle_fin` + 14 
    WHERE t1.`cle_deb` IS NOT NULL

    (Je pourrais désactiver les contraintes de clés étrangères, mais alors je ne vois pas l'utilité d'en mettre : si les FK existent, c'est pour être utilisées, n'est-ce pas ?)

  3. #3
    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
    Le problème, c'est que MySQL ne dispose pas de mécanismes permettant de "déferrer" une contrainte, c'est-à-dire de reporter la vérification de la contrainte à la fin d'une transaction.
    Donc, à part faire sauter la contrainte et la remettre après l'update, ça risque d'être compliqué...

    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

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 145
    Points
    145
    Par défaut
    Bonjour Ced, et merci pour ta réponse

    Donc, si je comprends bien, les clés étrangères sous MySql ne serviraient qu'à respecter la norme Sql ? (ça sent le troll )

    Bon, je vais quand même les garder, ça oblige à de la rigueur, ce qui n'est pas plus mal : donc je désactive les clés, fais l'update, puis les réactive. Mouais, mais ok...

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 145
    Points
    145
    Par défaut
    Eh bien non...
    Il ne faut pas supprimer les clés étrangères pour les recréer ensuite
    (Je me suis rendu compte de cette erreur en cherchant la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE ma_table 
    DROP CONSTRAINT nom_contrainte  FOREIGN KEY REFERENCES table_pere(cle_pere)
    (ce code est erroné)

    En fait, la réponse se trouvait dans un message de 2003 d'omiossec

    Il faut désactiver la vérification des contraintes, puis la réactiver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET FOREIGN_KEY_CHECKS=0
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET FOREIGN_KEY_CHECKS=1
    Yes !

  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
    Bien joué... Voilà comment "déférer" les clefs le temps d'une mise à jour sous MySQL.

    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

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

Discussions similaires

  1. [VxiR2] Lister toutes les tables jointes avec une table
    Par Geo55 dans le forum Designer
    Réponses: 3
    Dernier message: 16/06/2016, 20h44
  2. Changer le nom d'une table sur SQL server avec une requete
    Par Oluha dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 01/02/2014, 23h35
  3. Réponses: 1
    Dernier message: 06/04/2009, 19h23
  4. [MySQL] requete sur table jointe
    Par winnie82 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 21/03/2006, 16h27
  5. Tables jointes, avec enregistrements multiples
    Par ARRG dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/07/2004, 14h00

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