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

MySQL:仅当满足条件时才更新字段,mysql,if-statement,sql-update,Mysql,If Statement,Sql 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 T

是否可以在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
正确的方法是什么?

试试以下方法:

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

这里有另一个例子:

UPDATE prices
SET final_price= CASE
   WHEN currency=1 THEN 0.81*final_price
   ELSE final_price
END
这是因为MySQL不会更新行,如果没有更改:

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


我认为另一个更容易阅读的解决方案是:

UPDATE test 
    SET something = 1, field = IF(condition is true, 1, field) 
    WHERE id = 123
如果满足条件,则将“字段”设置为1(例如OP),如果不满足,则使用“字段”的当前值。使用上一个值与不更改相同,因此您可以继续使用。

另一个变化:

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

这将使用
{new value}
更新
字段
,仅当满足
{condition}

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

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

找到具有以下条件的解决方案:

  $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";

“字段”只有在满足条件时才会更新,否则不会执行任何操作。是的!这正是我想要它做的。关于
其中currency=1
?@fedorqui您的查询现在看起来像是您将更新当前所在的行!=1,并将其设置为与已设置的值相同的值。这可能会触发更新触发器,并具有更新“ON update”
TIMESTAMP
列等其他效果。@fedorqui,我冒昧地用文档引用更新了您的答案,说明了这一操作的实际原因。在更新查询中使用case的唯一原因是,您是否希望根据条件以不同方式更新行。如果您只想更新一些行,只需将条件添加到where子句中。我再次否决了此选项。。。因为这根本不是解决问题的办法。。。让我困惑的是,人们似乎是如何提高投票率的this@Dominique,可能您被word
条件的错误弄糊涂了。
?WHERE条件的问题是它作用于行级别,而不是字段级别。如果您有几个字段的更新,并且只需要其中一个字段上的条件,那么WHERE将不起作用。它要么会导致行被更新,要么不会,也会影响其他字段。我没有让你对任何事情感到困惑,我只知道你的建议是完全错误的,而不是OP所要求的。您应该再次阅读问题
updateservers SET port=IF(port!=21,22,port),其中`id`=123
在我的例子中,我想将ssh端口设置为22,如果不是只有21个telnet端口,那么它应该是单等于而不是双等于吗?这个答案也比公认的答案好得多!好的,我发现这是一个很好的答案,但是如果这个特定字段不断更新,性能会发生什么变化呢?是的,我同意,这看起来更漂亮,这也是我注意到的mysql workbench语法的格式。我个人认为这应该是这个查询的常用语法。