MySQL:仅在满足条件时更新字段

时间:2013-02-15 11:07:27

标签: mysql if-statement sql-update

是否可以在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

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

6 个答案:

答案 0 :(得分:107)

是!

这里有另一个例子:

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

这是有效的,因为MySQL没有更新行,如果没有变化,as mentioned in docs

  

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

答案 1 :(得分:17)

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

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

这样做是设置'字段'如果条件满足并使用'字段'的当前值,则为1(如OP用作示例)如果没有满足。使用前一个值与不改变相同,所以你去。

答案 2 :(得分:15)

试试这个:

UPDATE test
SET
   field = 1
WHERE id = 123 and condition

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

另一种变化:

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

只有在符合field时才会{new value}更新{condition}

答案 5 :(得分:-1)

找到具有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";