我有一个名为users的MySQL表,其中包含所有用户的简单计数。
| 用户标识|计数器1|计数器2|
| - ------| - ------| - ------|
| 1个|无|五个|
| 第二章|1个|六个|
| 三个|第二章|七|
| 四个|三个|八个|
我想运行一个查询,将counter1的值更新为counter1-#或0(#可以是任何整数),取较大值,以用于可能的多个用户。
我正在执行以下查询以更新用户2和3:
UPDATE
users
SET
counter1 = CASE user_id
WHEN 2 THEN GREATEST(counter1 - 2, 0)
WHEN 3 THEN GREATEST(counter1 - 5, 0)
ELSE counter1 END
WHERE user_id IN(2, 3);
运行上述查询将返回错误:
- BIGINT UNSIGNED值超出"("用户"."计数器1 "-2)"的范围**
我试图达到的最终结果是用户2和用户3在执行查询后都具有最小的counter1值0,因为在这两个用户的情况下,从他们的counter1值中减去2/5将是负数,这当然不起作用。
有没有办法用一个查询来完成这个任务?
2条答案
按热度按时间axr492tv1#
问题是当
counter1
小于2时,表达式counter1 - 2
会产生一个负值。但由于它声明为UNSIGNED
,使用它的表达式的结果也是无符号的,因此不允许负值。使用
IF()
表达式来防止计算这些无效值,而不是从中减去。h7appiyu2#
最简单的方法是: