【问题标题】:MySQL: update a field only if condition is metMySQL:仅在满足条件时更新字段
【发布时间】:2013-01-31 08:21:58
【问题描述】:

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

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

【问题讨论】:

  • 在更新查询中使用 case 的唯一原因是,如果您想根据条件以不同方式更新行。如果你只是想更新一些行,只需在 where 子句中添加条件即可。

标签: mysql if-statement sql-update


【解决方案1】:

是的!

这里有另一个例子:

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

这是因为 MySQL 不会更新行,如果没有变化,as mentioned in docs:

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

【讨论】:

  • "field" 只有在满足条件时才会更新,否则什么都不做。
  • 是的!正是我想要它做的。
  • WHERE currency=1 呢?
  • @fedorqui 正如您的查询现在的样子,您还将更新 current != 1 的行,使其与已有的值相同。这可能会触发更新触发器并产生其他效果,例如更新“ON UPDATE”TIMESTAMP 列。
  • @fedorqui,我冒昧地更新了您的答案,并附上了说明为什么这确实有效的文档参考。
【解决方案2】:

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

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

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

【讨论】:

  • 是的,我同意,这看起来更漂亮,也是我注意到mysql工作台语法的格式。我个人认为这应该是这个查询的常用语法。
【解决方案3】:

试试这个:

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

【讨论】:

  • 我再次对此投了反对票……因为这甚至不是解决问题的方法……这让我感到困惑,人们似乎对此投了赞成票
  • @Dominique,也许你对condition这个词的错误感到困惑?
  • WHERE 条件的问题在于它作用于行级别而不是字段级别。如果您有几个字段的更新,并且您只想对其中一个字段设置条件,那么 WHERE 将不起作用。它会导致行更新或不更新,也会影响其他字段。
  • 我没有让您对任何事情感到困惑,我只知道您的建议是完全错误的,而不是 OP 所要求的。你应该再读一遍这个问题
【解决方案4】:

另一种变化:

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

这将仅在满足 {condition} 时将 field 更新为 {new value}

【讨论】:

  • 这个答案也比公认的好很多!
  • 好吧,我觉得这是一个很好的答案,但如果这个特定字段不断更新,性能会发生什么变化
【解决方案5】:

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

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

【讨论】:

  • UPDATE servers SET port = IF(port != 21, 22, port) WHERE `id` = 123; 在我的情况下,我想将 ssh 端口设置为 22,如果不仅是 21 telnet 端口,否则离开 22
  • 不应该是单等于而不是双等于吗?
【解决方案6】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多