mysql仅在一个字段为空时进行多次更新
假设我有一个名为control的字段。 如果控件为null,则必须更新控件字段f1、f2、f3、f4、f5。 如果控件不为null,我只需更新f4和f5。 我该如何实现这个目标? 我试过这样的方法: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
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