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 avec des données d'une autre table


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 37
    Points : 9
    Points
    9
    Par défaut update avec des données d'une autre table
    eh oui,
    malgré des recherches assidues pas moyen de trouver la solution....
    Mon pb: updater un champ d'une table avec les valeurs stockées dans une autre table.
    Est-ce possible ?
    Peut-on utiliser une jointure dans un update pour cela ?
    Mon serveur tourne sous Mysql 5.0

    merci de vos suggestions


  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 27
    Points
    27
    Par défaut
    Salut,

    Tu peut donner plus d'informations comme la description des tables dont tu parle avec leurs champs. De plus tu veut que l'update soit automatique ou pas ?
    Si tu veut qu'elle le soit il faut utiliser des triggers pour cela.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 37
    Points : 9
    Points
    9
    Par défaut précisions
    mes données sont dans des champs type varchar
    Je doute des syntaxes que j'utilise (plutôt jusque là habitué au syntaxe mssql ou oracle)
    le serveur me retourne un message de timeout.


  4. #4
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 37
    Points : 9
    Points
    9
    Par défaut préciisions encore
    ma requête est de la forme suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update t1
    set a1=(select a2 from t2 
    where t1.a3=t2.c3)
    les triggers ? je ne connais pas (mais ne renonce pas à en savoir un peu plus ..)
    comment s'en servir dans ce cas ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 27
    Points
    27
    Par défaut
    Si tu veut affecter une valeur d'un champs d'une table dans un champs d'une autre table tu peut procéder ainsi par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update table1 set `champs_table1`=(select champs_table2 from table2 where id=1) where id=1;
    Si tu veut que la valeur d'un champs soit obligatoirement une valeur appartenant à un champs d'une autre table (clé étrangère), tu peut procéder ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ALTER TABLE `table1`
      ADD CONSTRAINT `nom_contrainte` FOREIGN KEY (`champs_table1`) REFERENCES `table2` (`champs_table2`),

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 37
    Points : 9
    Points
    9
    Par défaut je teste demain
    je tente demain ta proposition.

    d'ici la je vais fermer les yeux un peu.
    Merci pour ton aide



    corto31

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 27
    Points
    27
    Par défaut
    Quand j'ai écrit le message précédent j'avais pas vu ton message juste avant, j'ai reprit ta requête avec les tables d'une d'une de mes base et elle marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    update salle
    set `intitule`=(select `intitule` from batiment
    where salle.`FK_Batiment_id`= batiment.`id`);
    Donc je voit pas trop pourquoi sa cloche chez toi.

  8. #8
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 37
    Points : 9
    Points
    9
    Par défaut
    avant de partir:

    comme tu as pu le remarquer dans la syntaxe de ma requête,
    je mets à jour un champs de ma table1 avec les valeurs d'un autre champs d'une table2 en
    vérifiant (ou en faisant une jointure) une égalité entre deux autres champs de ces deux tables.
    cela ne semble pas bien supporté ...

    Peut-être je demande l'impossible et devrais je trouver une astuce...

  9. #9
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 37
    Points : 9
    Points
    9
    Par défaut
    en effet je suis dans une syntaxe proche de ta requête.
    Mon serveur est peut-être simplement à la ramasse car les champs qui sont de type id dans ta requête sont de type varchar pour moi.
    Ce genre de plaisanteries dans ce cas est sans doute gourmand en ressources et explique le time-out
    va falloir feinter

    @+
    je verrais demain
    merci

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 27
    Points
    27
    Par défaut
    C'est moi qui est à la ramasse .
    Je crois pas qu'il soit possible de comparer deux chaine de caractères avec '=', il faut utiliser STRCMP() ou LIKE.
    J'espère que sa marchera cette fois.

  11. #11
    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 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Citation Envoyé par corto31 Voir le message
    eh oui,
    malgré des recherches assidues pas moyen de trouver la solution....
    Ben, en commençant par lire la doc MySQL, on a la réponse et même un petit exemple :
    Depuis MySQL version 4.0.4, vous pouvez aussi faire des opérations de UPDATE qui couvrent plusieurs tables :

    UPDATE items,month SET items.price=month.price
    WHERE items.id=month.id;

    L'exemple ci-dessus montre une jointure interne, en utilisant la virgule comme séparateur, mais une commande UPDATE multi-table peut utiliser n'importe quel type de jointure autorisée dans une commande SELECT, tel qu'un LEFT JOIN.
    ced

  12. #12
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 37
    Points : 9
    Points
    9
    Par défaut
    merci ced,
    comme je sais lire j'avais parcouru assidument la doc en ligne sur le site mysql.
    Sans avoir pour l'instant trouver la réponse
    Bref,
    le souci demeure pour moi
    en utilisant la syntaxe proposé je n'y arrive pas.

    dans la formulation proposée ci dessous,l'équivalent des deux id sont dans mes tables des données texte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE items,month SET items.price=month.price
    WHERE items.id=month.id;
    Donc mon serveur me répond invariablement
    ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
    celà est peut-être du à une config système incorrect ou à une faible puissance de mon serveur (en fait un simple micro).
    pour répondre à BenKaRhu; j'essaye tes propositions mais rien de bien probant pour l'instant. A suivre....

    merci


  13. #13
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Salut corto31,

    Ta question d'origine est résolue puisqu'on t'a proposé plusieurs syntaxes d'UPDATE multi-tables (par ailleurs facilement trouvables dans la doc )

    Concernant le dernier problème il peut s'agir d'une requête zombie qui bloque l'accès en écriture aux lignes que tu veux modifier. Pour t'en assurer, exécute un SHOW FULL PROCESSLIST puis tu peux utiliser KILL <id process> pour la supprimer.

  14. #14
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 37
    Points : 9
    Points
    9
    Par défaut même tardive la réponse à mon souci
    J'ai résolu mes difficultés lorsque j'ai trouvé à index le bon champs dans la bonne table pour que l'update s'éxécute dans des délais raisonnable.
    l'instruction sql en tant que telle n'était pas en cause mais bien plutôt la structure de mes tables.

    @+


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

Discussions similaires

  1. Update avec un controle sur une autre table
    Par Calvein dans le forum Requêtes
    Réponses: 0
    Dernier message: 19/06/2009, 18h50
  2. insert des données sur une autre table
    Par dngaya dans le forum Adaptive Server Enterprise
    Réponses: 2
    Dernier message: 18/02/2009, 15h21
  3. UPDATE avec les données d'une autre table
    Par henri3m dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/10/2007, 12h09
  4. Réponses: 11
    Dernier message: 18/10/2007, 12h49
  5. Réponses: 3
    Dernier message: 18/07/2006, 17h37

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