+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10
  1. #1
    Membre habitué Avatar de tintin72
    Inscrit en
    septembre 2003
    Messages
    652
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 652
    Points : 143
    Points
    143

    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 :
    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 Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 899
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 899
    Points : 25 044
    Points
    25 044

    Par défaut

    Dans ta requête, quand id = 4, tu demandes cette opération :
    Code :
    SET stock = stock = stock - 2
    Même opération bizarre pour id = 6

    Essaie plutôt comme ça :
    Code :
    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 de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « 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
    Inscrit en
    septembre 2003
    Messages
    652
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 652
    Points : 143
    Points
    143

    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 Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 899
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 899
    Points : 25 044
    Points
    25 044

    Par défaut

    Que donne la requête suivante ?
    Code :
    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 de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « 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
    Inscrit en
    septembre 2003
    Messages
    652
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 652
    Points : 143
    Points
    143

    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 Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 899
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 899
    Points : 25 044
    Points
    25 044

    Par défaut

    De quel type est la colonne stock ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « 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
    Inscrit en
    septembre 2003
    Messages
    652
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 652
    Points : 143
    Points
    143

    Par défaut

    De quel type est la colonne stock ?
    INT UNSIGNED

  8. #8
    Membre habitué Avatar de tintin72
    Inscrit en
    septembre 2003
    Messages
    652
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 652
    Points : 143
    Points
    143

    Par défaut

    Ok, j'ai finalement trouvé la bonne syntaxe qui est toute bête:
    Code :
    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
    Expert Confirmé Avatar de ericd69
    Homme Profil pro Eric Dureuil
    Développeur informatique
    Inscrit en
    avril 2011
    Messages
    1 898
    Détails du profil
    Informations personnelles :
    Nom : Homme Eric Dureuil
    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 898
    Points : 3 209
    Points
    3 209

    Par défaut

    salut,

    Code sql :
    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
    Inscrit en
    septembre 2003
    Messages
    652
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 652
    Points : 143
    Points
    143

    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 :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •