Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql仅在一个字段为空时进行多次更新_Mysql_Sql_If Statement_Sql Update - Fatal编程技术网

mysql仅在一个字段为空时进行多次更新

mysql仅在一个字段为空时进行多次更新,mysql,sql,if-statement,sql-update,Mysql,Sql,If Statement,Sql Update,假设我有一个名为control的字段。 如果控件为null,则必须更新控件字段f1、f2、f3、f4、f5。 如果控件不为null,我只需更新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_not

假设我有一个名为control的字段。 如果控件为null,则必须更新控件字段f1、f2、f3、f4、f5。 如果控件不为null,我只需更新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,就不再为null,因此除了f4和f5之外的其他更新都不会被处理。 此外,我如何在if语句中告诉您不要对ELSE分支执行任何操作? 弄糊涂了。 我本想进行选择和嵌套更新,但出现了许多错误。
谢谢大家

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

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


完成了!谢谢你的建议。 对谁有用:

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 ;

试试这样的

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;  
使用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

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

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

因此,老实说,保留旧值

,我只对f4和f5使用update语句,然后对其他列使用单独的语句。你也许可以得到一个更新语句来完成所有这些,但是为什么要这么努力呢?练习:说真的,因为我想了解脚本页面,我想了解一些我所缺少的关于更新语句的复杂信息,因为我认为在一个查询中包含所有内容可能很优雅。我认为我拥有实现这一目标的所有手段,但我无法将它们混合在正确的回应中。谢谢我最终得到了一个存储过程,但您的代码正是我最初寻找的
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