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 une valeur issue d'une autre table


Sujet :

Requêtes MySQL

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 369
    Points : 5 734
    Points
    5 734
    Billets dans le blog
    1
    Par défaut Update avec une valeur issue d'une autre table
    Bonjour,

    j'ai 2 tables (customer et country) et la table customer contient un champ country_key à mettre à jour si le customer a changé de country.

    Voici la structure des 2 tables :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DROP TABLE IF EXISTS `customer`;
    CREATE TABLE `customer` (
      `customer_login_id` int NOT NULL AUTO_INCREMENT,
      `country_key` smallint DEFAULT NULL,
      `organization` varchar(50) COLLATE utf8_bin DEFAULT NULL,
      UNIQUE KEY `customer_login_id_UNIQUE` (`customer_login_id`),
      KEY `FK_COUNTRY3` (`country_key`),
      CONSTRAINT `FK_COUNTRY3` FOREIGN KEY (`country_key`) REFERENCES `country` (`country_key`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB AUTO_INCREMENT=27001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DROP TABLE IF EXISTS `country`;
    CREATE TABLE `country` (
      `country_key` smallint NOT NULL AUTO_INCREMENT,
      `country` varchar(30) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
      `region` varchar(30) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '',
      PRIMARY KEY (`country_key`),
      UNIQUE KEY `uk_country` (`country`)
    ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    et les 3 requêtes essayées :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE    customer
    SET              country_key = country.country.key
    FROM         country, customer
    WHERE     country.country = 'valeur_de_country' and customer_SESA=xxx

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update customer.country_key=country.country_key
    from customer, country
    where  country.country = 'valeur_de_country' and customer_SESA=xxx

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update customer cu
    set  cu.country_key = (SELECT FROM country co
    where co.country = 'valeur_de_country') where cu.customer_SESA=xxx

    Je me suis inspiré ce cette ancienne discussion : https://www.developpez.net/forums/d2869/bases-donnees/langage-sql/requete-update-partir-d-table mais ce n'était pas du MySQL et dans les 3 cas, ça me dit "erreur SQL". Pouvez-vous me proposer un truc qui fonctionne ?

    Par exemple, avant, le customer était dans le country "Argentina" et le country_key était 1 mais il vient de passer dans le country "Brazil" et du coup le customer_key doit passer à 2.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Bonsoir

    Quelque chose comme ça :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    update customer CU
    set CU.country_key =
       (select CO.country_key
        from country CO
        where CO.country = 'valeur_de_country'
       )
    where CU.customer_login_id=123

    Dans vos trois requêtes, vous testez une colonne customer_SESA qui n'existe pas dans votre script , ça ne peut évidemment pas fonctionner

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 369
    Points : 5 734
    Points
    5 734
    Billets dans le blog
    1
    Par défaut

    Ca fonctionne !

    Et effectivement, j'ai changé le nom de la colonne mais ai utilisé une ancienne sauvegarde.

    La voici à jour :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DROP TABLE IF EXISTS `customer`;
    CREATE TABLE `customer` (
      `customer_SESA` int NOT NULL AUTO_INCREMENT,
      `country_key` smallint DEFAULT NULL,
      `organization` varchar(50) COLLATE utf8_bin DEFAULT NULL,
      UNIQUE KEY `customer_login_id_UNIQUE` (`customer_SESA`),
      KEY `FK_COUNTRY3` (`country_key`),
      CONSTRAINT `FK_COUNTRY3` FOREIGN KEY (`country_key`) REFERENCES `country` (`country_key`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB AUTO_INCREMENT=544343 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

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

Discussions similaires

  1. Pb UPDATE d'une table avec une autre table
    Par Korben-Dallas dans le forum Requêtes
    Réponses: 50
    Dernier message: 07/02/2013, 17h09
  2. update avec une autre valeur
    Par flash22 dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 20/04/2011, 14h02
  3. Réponses: 4
    Dernier message: 01/06/2007, 13h54
  4. Réponses: 4
    Dernier message: 15/03/2007, 20h32
  5. mise a jour d'une table paradox avec une autre table sous delphi
    Par bobo2005 dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/01/2007, 21h07

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