减少mysql中的值但不是负数
Posted
技术标签:
【中文标题】减少mysql中的值但不是负数【英文标题】:Decrement value in mysql but not negative 【发布时间】:2013-04-23 01:00:37 【问题描述】:当用户在 php 和 mysql 中删除它时,我想减少一个值。我想检查不低于 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”,即使它们是非负数?