it-roy-ru.com

MySQL: обновлять поле, только если условие выполнено

Можно ли выполнить запрос UPDATE в MySQL, который обновляет значение поля, только если выполняется определенное условие? Что-то вроде этого:

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

Другими словами:

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

Как правильно это сделать?

52
Caballero

Да!

Вот вам еще один пример:

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

Это работает, потому что MySQL не обновляет строку, если нет изменений, как упомянуто в документации :

Если вы установите для столбца значение, которое он в данный момент имеет, MySQL заметит это и не обновляет его.

100
fedorqui

Другое решение, которое, на мой взгляд, легче читать, было бы:

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

Для этого нужно установить «field» в 1 (как OP, используемый в качестве примера), если условие выполнено, и использовать текущее значение «field», если оно не выполнено. Использование предыдущего значения - это то же самое, что не изменять, так что все готово.

15
Dominique

Попробуй это:

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

Другое решение, мы можем использовать условную функцию MySQL IF():

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

Еще один вариант:

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

Это обновит field с {new value}, только если {condition} встречается

0
phoenix