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 sur plusieurs lignes ?


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut UPDATE sur plusieurs lignes ?
    Bonjour,

    Je voudrais faire un UPDATE sur plusieurs lignes avec différentes valeurs pour
    chaque ligne, (le but étant de décrémenter la valeur).
    Après quelques recherches je suis arrivé à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE `ma_table` SET stock = CASE 
    WHEN id = 4 THEN stock = stock - 2 
    WHEN id = 6 THEN stock = stock - 1 
    END 
    WHERE id IN (4,6);
    Tout semble fonctionner (MySQL me dit que 2 lignes ont été affectées) SAUF QUE dans la table les valeurs en question restent inchangées.

    Quelqu'un pourrait-il m'aider ?

    Merci

  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
    Dans ta requête, quand id = 4, tu demandes cette opération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET stock = stock = stock - 2
    Même opération bizarre pour id = 6

    Essaie plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE `ma_table`
    SET stock =
    	CASE
    		WHEN id = 4 THEN (stock - 2)
    		WHEN id = 6 THEN (stock - 1)
    	END
    WHERE id IN (4,6);
    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
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Salut et merci pour ta réponse.
    Malheureusement ça ne fonctionne pas, j'ai l'erreur:
    #1690 - BIGINT UNSIGNED value is out of range in '(`ma_base`.`ma_table`.`stock` - 2)'
    Une idée ?

  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
    Que donne la requête suivante ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT id, 
    	CASE
    		WHEN id = 4 THEN (stock - 2)
    		WHEN id = 6 THEN (stock - 1)
    	END AS stock
    FROM ma_table
    WHERE id IN (4,6)
    Quelles valeurs y a t-il actuellement dans stock pour ces id.
    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
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Que donne la requête suivante ?
    Toujours la même erreur:
    #1690 - BIGINT UNSIGNED value is out of range in '(`ma_base`.`ma_table`.`stock` - 2)'
    Quelles valeurs y a t-il actuellement dans stock pour ces id.
    15.

  6. #6
    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
    De quel type est la colonne stock ?
    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 !

  7. #7
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    De quel type est la colonne stock ?
    INT UNSIGNED

  8. #8
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Ok, j'ai finalement trouvé la bonne syntaxe qui est toute bête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE `my_table` SET stock = CASE
    WHEN id = 4 THEN stock - 2
    WHEN id = 6 THEN stock - 1
    END
    WHERE id IN (4,6);
    Maintenant mon problème est que si par exemple la valeur de "stock" est plus
    petite que la valeur à enlever, j'obtiens l'erreur:
    #1690 - BIGINT UNSIGNED value is out of range in '(`ma_base`.`ma_table`.`stock` - 2)'
    Il faut donc que j'insert un IF dans ma requête pour dire que si la valeur à enlever est plus grande que stock, alors stock vaut zéro, sinon on effectue la soustraction.

    Quelqu'un pourrait-il m'aider pour la syntaxe car je galère pas mal.

    Merci

  9. #9
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE `my_table` SET stock = CASE
    WHEN id = 4 and stock>=2 THEN stock - 2
    WHEN id = 6 and stock>=1 THEN stock - 1
    END
    WHERE id IN (4,6);
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  10. #10
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Merci pour ta réponse.
    De mon coté j'ai trouvé une syntaxe qui permet en plus de mettre "stock" à zero si la valeur à extraire est plus grande ou égal à stock:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE `my_table` SET stock = CASE
    WHEN id = 4 THEN stock - IF(2 >= stock, stock, 2)
    WHEN id = 6 THEN stock - IF(1 >= stock, stock, 1)
    END
    WHERE id IN (4,6);

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

Discussions similaires

  1. Fonction Sql "INSERT,UPDATE" en vba sur plusieurs lignes
    Par darkjeje dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/02/2013, 16h02
  2. update sur plusieurs lignes avec table temporaire
    Par -=mateo=- dans le forum SQL
    Réponses: 3
    Dernier message: 23/12/2010, 14h40
  3. [SQL] update sur plusieurs lignes
    Par Hurin dans le forum Langage SQL
    Réponses: 8
    Dernier message: 04/08/2008, 16h37
  4. Réponses: 12
    Dernier message: 25/09/2007, 17h22
  5. Update sur plusieurs lignes
    Par JOUCHET dans le forum Oracle
    Réponses: 1
    Dernier message: 20/05/2006, 18h37

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