81

是否可以在 MySQL 中执行 UPDATE 查询,仅在满足特定条件时才更新字段值?像这样的东西:

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

这样做的正确方法是什么?

4

6 回答 6

145

是的!

这里还有另一个例子:

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

这是有效的,因为如果没有更改,MySQL 不会更新该行,如docs 中所述

如果您将列设置为它当前具有的值,MySQL 会注意到这一点并且不会更新它。

于 2013-02-15T11:10:03.700 回答
42

在我看来,另一个更容易阅读的解决方案是:

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

如果满足条件,则将“field”设置为 1(如 OP 示例),如果不满足,则使用“field”的当前值。使用先前的值与不更改相同,所以你去。

于 2016-01-29T10:45:59.910 回答
17

试试这个:

UPDATE test
SET
   field = 1
WHERE id = 123 and condition
于 2013-02-15T11:10:01.117 回答
3

IF()我们可以使用 MySQL条件函数的另一种解决方案:

UPDATE test
SET  field  = IF(something == 1{CONDITION}, 1 {NEW VALUE}, field)
WHERE `id` = 5
于 2018-06-28T09:14:53.637 回答
2

另一种变化:

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

仅当满足时才会更新fieldwith{new value}{condition}

于 2017-04-18T20:42:11.433 回答
-2

找到了 AND 条件的解决方案:

  $trainstrength = "UPDATE user_character SET strength_trains = strength_trains + 1, trained_strength = trained_strength +1, character_gold = character_gold - $gold_to_next_strength WHERE ID = $currentUser AND character_gold > $gold_to_next_strength";
于 2019-08-11T08:36:34.260 回答