web-dev-qa-db-fra.com

MySQL: met à jour un champ uniquement si la condition est remplie

Est-il possible de faire une requête UPDATE dans MySQL qui met à jour la valeur du champ uniquement si certaines conditions sont remplies? Quelque chose comme ça:

UPDATE test
SET
    CASE
        WHEN true
        THEN field = 1
    END
WHERE id = 123

En d'autres termes:

UPDATE test
SET
    something = 1,        /*field that always gets updated*/
    CASE
        WHEN true
        THEN field = 1    /*field that should only get updated when condition is met*/
    END
WHERE id = 123

Quelle est la bonne façon de faire cela?

52
Caballero

Oui!

Ici vous avez un autre exemple:

UPDATE prices
SET final_price= CASE
   WHEN currency=1 THEN 0.81*final_price
   ELSE final_price
END

Cela fonctionne car MySQL ne met pas à jour la ligne. S'il n'y a pas de changement, comme indiqué dans docs :

Si vous définissez une colonne sur la valeur actuelle, MySQL le remarquera et ne le met pas à jour.

100
fedorqui

Une autre solution qui, à mon avis, est plus facile à lire serait:

UPDATE test SET something = 1, field = IF(condition is true, 1, field) WHERE id = 123

Cela permet de définir "champ" sur 1 (comme OP utilisé à titre d'exemple) si la condition est remplie et d'utiliser la valeur actuelle de "champ" si elle n'est pas remplie. Utiliser la valeur précédente revient à ne pas changer, alors voilà.

15
Dominique

Essaye ça:

UPDATE test
SET
   field = 1
WHERE id = 123 and condition
15
Hamlet Hakobyan

Une autre solution consiste à utiliser la fonction conditionnelle MySQL IF():

UPDATE test
SET  field  = IF(something == 1{CONDITION}, 1 {NEW VALUE}, field)
WHERE `id` = 5
0
krishna

Une autre variante:

UPDATE test
SET field = IF ( {condition}, {new value}, field )
WHERE id = 123

Ceci mettra à jour la field avec {new value} uniquement si {condition} est rencontré.

0
phoenix