MySQL 8中ON DUPLICATE KEY UPDATE条件更新force_check问题
MySQL 8 基于字段差异更新force_check的问题解决
你遇到的问题根源是MySQL对NULL值的比较逻辑:当字段值为NULL时,用普通的<>运算符和非NULL值比较会返回NULL,而IF函数会将NULL判定为false,所以你的条件department <> VALUES(department)不会触发true分支,force_check保持原值不变,最终显示0行受影响。
针对这个场景,你可以用MySQL的**NULL安全比较运算符<=>**来判断两个值是否相等(包括都为NULL的情况),然后取反来触发更新。修正后的SQL如下:
INSERT INTO user (id, department) VALUES ('ABC', 'Dep1') ON DUPLICATE KEY UPDATE force_check = IF(NOT(department <=> VALUES(department)), 1, force_check);
或者你也可以手动处理NULL的边界情况,逻辑更直观:
INSERT INTO user (id, department) VALUES ('ABC', 'Dep1') ON DUPLICATE KEY UPDATE force_check = CASE WHEN (department IS NULL AND VALUES(department) IS NOT NULL) OR (department IS NOT NULL AND department <> VALUES(department)) THEN 1 ELSE force_check END;
执行上述任意一个语句后,因为原有数据的department是NULL,新插入的department是Dep1,满足"值不同"的条件,force_check会被更新为1,同时department字段因为你没在UPDATE子句中指定修改,会保持原有NULL值,完全符合你的期望结果。
内容的提问来源于stack exchange,提问作者Erry215
相关产品推荐
相关产品推荐

