如何防止Mysql中的负数

时间:2010-06-01 15:40:40

标签: php mysql

我的数据库中的数据从0开始。

我的php会根据用户的输入为数据添加1或-1。 我的问题是,如果数据为0并且用户试图减去1.数据变为4294967295 这是INT数据类型的最大值。反正有没有提供数据 即使用户要求-1,也会保持0?谢谢你的回复..

我的sql命令如下所示

update board set score=score-1 where team='TeamA'
//this would generate 4294967295 if the score is 0.....

7 个答案:

答案 0 :(得分:9)

是..

UPDATE board SET score = score - 1 WHERE team = 'TeamA' AND score > 0

答案 1 :(得分:3)

update board set score=score-1 
where team='TeamA'
and score > 0

答案 2 :(得分:1)

为什么不添加AND SCORE> 0

答案 3 :(得分:1)

Jerry的问题的其他解决方案是使用MySQL“CAST”(如果想要减少数量直到它达到零(但不再是)):

UPDATE board SET score = CAST(score - 1 AS SIGNED) WHERE team = 'TeamA'

答案 4 :(得分:0)

ALTER TABLE board MODIFY score UNSIGNED INT;

答案 5 :(得分:0)

您是否将列设置为无符号?

答案 6 :(得分:0)

如果您使用的是事务性数据库(如InnoDB),则可以执行以下操作:

SQL> START TRANSACTION;
SQL> UPDATE board SET score=score-1 WHERE team="TeamA"
SQL> SELECT @@warning_count as wc
if($row["wc"] > 0) {
  $error = true;
SQL> ROLLBACK;
} else
SQL> COMMIT;

这只是逻辑,而不是实际的实现。

对于上述问题,它可能不是很有用,但它适用于您不能允许负数的其他情况,并且您需要引发错误,例如,如果您有购物车并且需要更新所有选定产品的库存数量,您需要一次执行多个UPDATE查询。以上任何解决方案都只是SKIP更新产品,不会返回任何错误消息。当然有很多方法可以防止这种情况(比如在更新之前锁定表并读取数量),但这是一个快速(一个简洁的)解决方案。如果您需要警告代码/说明,可以使用“SHOW WARNINGS”代替“SELECT @@ warning_count”。