减少mysql中的值但不是负数

40 mysql decrement

当用户在php和mysql中删除它时,我想减少一个值.我想检查不要低于0.如果值为0则不减少.

mysql_query("UPDATE table SET field = field - 1 WHERE id = $number");
Run Code Online (Sandbox Code Playgroud)

如果字段为0则不执行任何操作

jue*_*n d 68

添加另一个条件仅在field更大时才更新0

UPDATE table 
SET field = field - 1
WHERE id = $number
and field > 0
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我现在觉得很愚蠢,但我很高兴找到你的答案。 (2认同)

Til*_*lge 36

您可以通过使用阻止新值降至零以下GREATEST().如果该值低于零,则零将始终大于您的计算值,从而防止使用低于零的任何值.

UPDATE  table
SET     field = GREATEST(0, field - 1)
WHERE   id = $number
Run Code Online (Sandbox Code Playgroud)

另请注意:请不要再使用mysql_*功能了.它们已被弃用,最终将从PHP中删除.请改用PDOMySQLi.

  • 在这种情况下,我得到错误“错误代码:1690。如果字段是无符号的,则BIGINT UNSIGNED值超出`table`.`field`-1的范围。 (2认同)
  • 我和@frops 有同样的错误。解决方案是添加一个 CAST: GREATEST(0, CAST(field AS SIGNED) - 1) (2认同)

Eel*_*ema 7

使用GREATEST的选项在较新的MySQL版本中不起作用,如果要更新多个字段而不是一个字段,则接受的答案可能无效.我对这个问题的解决方案是使用IF:

UPDATE  table
SET     field = IF(field > 0, field - 1, 0)
WHERE   id = $number
Run Code Online (Sandbox Code Playgroud)

  • 我没有看到任何说明 GREATEST 函数不适用于较新的 MySQL 版本的内容。截至 2016 年 10 月,MySQL 版本 2.7 文档仍然列出了它,但没有提及弃用:http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_greatest (2认同)