【问题标题】:Terser syntax for ON DUPLICATE KEY UPDATE only if one condition is true?仅当一个条件为真时才用于 ON DUPLICATE KEY UPDATE 的 Terser 语法?
【发布时间】:2020-04-23 08:06:10
【问题描述】:

我知道我可以做类似的事情

ON DUPLICATE KEY UPDATE 
    exampleColumn1 = IF (exampleCondition = 1, VALUES(exampleColumn1), exampleColumn1),
    exampleColumn2 = IF (exampleCondition = 1, VALUES(exampleColumn2), exampleColumn2),
    exampleColumn3 = IF (exampleCondition = 1, VALUES(exampleColumn3), exampleColumn3),
    # Etc etc

但由于我每次都在做完全相同的条件检查,所以肯定有更简洁的方法来写这个吗?在写出条件有点长的情况下,这将特别好。

根据我的阅读,如果我为此编写一个函数似乎是可能的,但我可以在一个普通的旧查询中做到这一点吗?

【问题讨论】:

  • 请向我们展示整个查询。
  • 对于任何 INSERT INTO ... ON DUPLICATE KEY UPDATE ... 格式查询,这意味着更多的一般问题,其中 ON DUPLICATE KEY UPDATE 中的每一列都按顺序应用完全相同的 IF 条件来决定是否更新值。

标签: mysql sql sql-update sql-insert on-duplicate-key


【解决方案1】:

简而言之:没有。 on duplicate key 语法不支持任何形式的过滤(where 条件等)。

但是,如果您的条件很长,一个技巧是使用用户变量来保存其返回值,您可以在以下分配中重复使用:

on duplicate key update
    exampleColumn1 = if(@do_update := (exampleCondition = 1), values(exampleColumn1), exampleColumn1),
    exampleColumn2 = if(@do_update, values(exampleColumn2), exampleColumn2),
    exampleColumn3 = if(@do_update, values(exampleColumn3), exampleColumn3)

【讨论】:

  • 我记得如果用户变量被初始化并在同一个语句中使用,它们有时会出现意外行为。这不是一个可能的问题吗?
  • @0xN0: 是的,这在select 语句中是正确的,其中列的评估顺序是未定义的,但在updates 中没有,从左到右评估,如explained in the documentation . UPDATE t1 SET col1 = col1 + 1, col2 = col1; : 语句中的第二个赋值将col2 设置为当前(更新的)col1 值,而不是原始的col1 值。结果是col1col2 具有相同的值。此行为不同于标准 SQL。
  • 啊啊啊我明白了。谢谢!
猜你喜欢
  • 2014-07-09
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 2021-02-06
  • 1970-01-01
  • 2017-06-29
相关资源
最近更新 更多