减少mysql中的值但不是负数

Posted

技术标签:

【中文标题】减少mysql中的值但不是负数【英文标题】:Decrement value in mysql but not negative 【发布时间】:2013-04-23 01:00:37 【问题描述】:

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

mysql_query("UPDATE table SET field = field - 1 WHERE id = $number");

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

【问题讨论】:

【参考方案1】:

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

UPDATE table 
SET field = field - 1
WHERE id = $number
and field > 0

【讨论】:

谢谢,我现在觉得自己很愚蠢,但很高兴找到你的答案。【参考方案2】:

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

UPDATE  table
SET     field = GREATEST(0, field - 1)
WHERE   id = $number

附带说明:请不要再使用mysql_* 函数。它们已被弃用,最终将从 PHP 中删除。请改用PDO 或MySQLi。

【讨论】:

仅当您也使用mysqli_connect() 时。您需要用 MySQLi 或 PDO 中的另一个函数替换以 mysql_ 开头的所有内容。 最佳。这适用于增量,而不仅仅是减量。 不错的解决方案!它不仅适用于递减,而且适用于任何减去的数字。相反,接受的答案只适用于递减/递增。 我遇到了与@frops 相同的错误。解决方案是添加一个 CAST: GREATEST(0, CAST(field AS SIGNED) - 1)【参考方案3】:

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

UPDATE  table
SET     field = IF(field > 0, field - 1, 0)
WHERE   id = $number

【讨论】:

我没有看到任何说 GREATEST 函数不适用于较新的 MySQL 版本的内容。截至 2016 年 10 月,MySQL 版本 2.7 文档仍然列出它,但没有提及弃用:dev.mysql.com/doc/refman/5.7/en/… GREATEST() 在 MySQL 8.0 中仍然可用【参考方案4】:
UPDATE table SET field = case when (field - 1) >0 then (field - 1)
else field end
WHERE id = $number

【讨论】:

【参考方案5】:
 UPDATE `table_name` SET field = field-1 WHERE `id` = '".$id."' AND field > 0

注意:字段的数据类型应该是整数。

【讨论】:

【参考方案6】:

如果该字段是 int 无符号的,以下是最好的:

UPDATE table 
SET field = field - 1
WHERE id = $number
and field > 0

# or
UPDATE  table
SET     field = IF(field > 0, field - 1, 0)
WHERE   id = $number

【讨论】:

以上是关于减少mysql中的值但不是负数的主要内容,如果未能解决你的问题,请参考以下文章

您是不是应该始终对 C 中的数字使用“int”,即使它们是非负数?

您是不是应该始终对 C 中的数字使用“int”,即使它们是非负数?

js判断输入的值是不是为数字,也不能是负数

怎么在python中判断是不是为负数?

oracle数据库中我想将a表中的b列结果为负数的转换成0,或者特定的一个数

excel2010,如何让会计专用格式负数显示负号,而不是括号?