MySQL中如何用单条UPDATE语句将unsigned字段计算负值设为0?
解决方案:单条UPDATE语句实现需求
可以用单条语句实现,问题出在无符号整数的减法溢出:因为counter1是unsigned int类型,当counter1小于要减去的数值时,counter1 - N会得到负数,而无符号整数不允许负数,这就触发了报错。
方法一:先判断再计算(推荐)
通过IF函数先判断counter1是否足够减去目标值,避免产生负数:
UPDATE users SET counter1 = CASE user_id WHEN 2 THEN IF(counter1 >= 2, counter1 - 2, 0) WHEN 3 THEN IF(counter1 >= 5, counter1 - 5, 0) ELSE counter1 END WHERE user_id IN(2, 3);
方法二:临时转换为有符号整数
将counter1临时转换为有符号整数,让减法的负数结果合法,再通过GREATEST取最大值0:
UPDATE users SET counter1 = CASE user_id WHEN 2 THEN GREATEST(CAST(counter1 AS SIGNED) - 2, 0) WHEN 3 THEN GREATEST(CAST(counter1 AS SIGNED) - 5, 0) ELSE counter1 END WHERE user_id IN(2, 3);
执行结果
两种方法执行后,用户2的counter1会从1变为0,用户3的counter1会从2变为0,完全符合需求。
内容的提问来源于stack exchange,提问作者user3130810
相关产品推荐
相关产品推荐

