【问题标题】:MYSQL Update same column with multiple where clauseMYSQL用多个where子句更新同一列
【发布时间】:2021-11-06 20:53:38
【问题描述】:

我找到了this 的问题,看起来和我的一样。但是,两者之间有一点区别,因为一个在 where 子句中使用相同的列,而我有一个不同的列。

这就是我想要实现的目标;

UPDATE table 
SET recent = 0 WHERE recent = 1 //update all `recent` column where its value is `1`.
AND
SET recent = 1 WHERE ID = 555 //update specific `recent` column where its ID is `555`.

是否可以在一个查询中做到这一点?

编辑:recent 的数据类型是Boolean,应该只有一个设置为TRUE。所以我想将其全部设置回FALSE,以确保它们都不为真,然后将ID555 的行更新为TRUE,使其成为唯一的TRUE

【问题讨论】:

    标签: mysql sql sql-update


    【解决方案1】:

    您可以使用case 表达式:

    UPDATE mytable
    SET    recent = CASE WHEN recent = 1 THEN 0
                         WHEN id = 555   THEN 1
                    END
    WHERE  recent = 1 OR id = 555
    

    【讨论】:

    • recent=1 AND id=555 的行的结果是什么? (并向 OP 提出问题:在这种情况下,预期的结果是什么?)
    • 我认为按顺序评估案例,因此 id = 555 应该排在第一位。
    【解决方案2】:

    为了未来的可维护性:停止寻找这个解决方案。

    隐含/预期的顺序是什么?

    • 是否先将最近设置为 0,然后将单个项目(对于 555)设置为 1?
    • 您是否会将 555 记录设置为 1,然后(与所有其他记录一起)设置为 0?

    我想我知道答案,但在以后的代码更新中很容易错过这一点。为将来的维护而优化,而不是为保存语句执行而优化。

    构建两个语句,在一个事务中执行它们,您将拥有可读、可维护和可理解的代码。

    (即使 Mureinik 的 CASE 语句对我来说也不是那么容易阅读,尽管我有点喜欢这个解决方案)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多