【问题标题】:mysql multiple updates only if one field is null只有一个字段为空时,mysql才会多次更新
【发布时间】:2013-12-20 17:41:59
【问题描述】:

假设我有一个名为“控制”的字段。 如果“control”为空,那么我必须更新字段“control”、“f1”、“f2”、“f3”、“f4”、“f5”。 如果“控制”不为空,我只需更新“f4”和“f5”。 我应该如何实现这个目标? 我试过类似的东西:

UPDATE table SET 
control = IF(control IS NULL, 1, do_nothing), 
f1 = IF(control IS NULL, value1, do_nothing),
f2 = IF(control IS NULL, value2, do_nothing),
f3 = IF(control IS NULL, value3, do_nothing),
f4 = value4,
f5 = value5
WHERE id = XX

但“控制”一旦设置为 1 就不再为空,因此不会处理其他更新(但 f4 和 f5)。 此外,如何在 if 语句中告诉 ELSE 分支上的“do_nothing”? 变得困惑。 我想进行选择和嵌套更新,但出现了很多错误。 谢谢大家

【问题讨论】:

  • 老实说,我只是对 f4 和 f5 使用更新语句,然后对其他列使用单独的语句。你也许可以得到一个更新语句来完成所有这些,但为什么要那么努力呢?
  • Excercise :) 说真的,因为我想在脚本页面上保持“轻松”,我想了解一些关于我缺少的 UPDATE 语句的复杂内容,因为我认为将所有内容都放在一个单个查询。我认为我拥有实现这一目标的所有工具,但我无法将它们混合在正确的“食谱”中

标签: mysql sql if-statement sql-update


【解决方案1】:

您可以使用存储过程,也可以使用两条语句来实现。

UPDATE table SET 
control = 1,
f1 = value1, 
f2 = value2, 
f3 = value3, 
f4 = value4,
f5 = value5
WHERE id = XX and control IS NULL

UPDATE table SET
f4 = value4,
f5 = value5
WHERE id = XX and control IS NOT NULL

【讨论】:

    【解决方案2】:

    完成!感谢您的建议。 对谁有用:

    DELIMITER |
    
    CREATE PROCEDURE `setLastLogin` 
    (
      IN  `ip_user`  varchar(255),
      IN  `user_id`  int
    )
    BEGIN
      /* Procedure text */
    
      SELECT control INTO @con
      FROM tbl_users
      WHERE id = user_id;
    
      IF (@con IS NULL) 
      THEN
         UPDATE tbl_users
         SET
         control = 1,
         date_control = NOW(),
         ip_control = ip_user,
         date_last_login = NOW(),
         ip_last_login = ip_user
         WHERE id = user_id;
      ELSE
         UPDATE tbl_users
         SET
         date_last_login = NOW(),
         ip_last_login = ip_user
         WHERE id = user_id;
    
      END IF;
    
    
    END|
    
    DELIMITER ;
    

    【讨论】:

      【解决方案3】:

      试试这样的?

      update table
      set f1 = case when control is null
                    then 'value1' else f1
               end,
          f2 = case when control is null
                    then 'value2' else f2
               end,
          f3 = case when control is null
                    then 'value3' else f3
               end,
          f4 = 'value4',
          f5 = 'value5'
      where id = XX;  
      

      【讨论】:

        【解决方案4】:

        使用 IF 条件:

        IF control IS NULL AND ID=XX THEN UPDATE table SET 
            control = 1,
            f1 = value1, 
            f2 = value2, 
            f3 = value3, 
            f4 = value4,
            f5 = value5
        
        ELSEIF control IS NOT NULL THEN UPDATE table SET
            f4 = value4,
            f5 = value5
        
        END IF
        

        【讨论】:

        • 不错的一个。谢谢。我最终得到了一个存储过程,但你的代码正是我最初想要的
        【解决方案5】:

        这不是对已经展示的内容的超级升级,但如果有人觉得它有用,你可以这样做

        UPDATE table SET 
        control = IF(control IS NULL, 1, control ), 
        f1 = IF(control IS NULL, value1, f1),
        f2 = IF(control IS NULL, value2, f2),
        f3 = IF(control IS NULL, value3, f3),
        f4 = value4,
        f5 = value5
        WHERE id = XX
        

        因此,保留旧值

        【讨论】:

          猜你喜欢
          • 2022-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多