代码之家  ›  专栏  ›  技术社区  ›  FlyingCat

如何防止MySQL中出现负数

  •  2
  • FlyingCat  · 技术社区  · 14 年前

    我的数据库中有从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 回复  |  直到 14 年前
        1
  •  9
  •   Ian P    14 年前

    对。。

    UPDATE board SET score = score - 1 WHERE team = 'TeamA' AND score > 0
    
        2
  •  3
  •   Martin Smith    14 年前
    update board set score=score-1 
    where team='TeamA'
    and score > 0
    
        3
  •  1
  •   jcolebrand    14 年前

    为什么不添加并评分>0

        4
  •  1
  •   lepe    14 年前

    Jerry问题的另一个解决方案是使用mysql“cast”(如果想要减少数量,直到它达到零(但不再是)):

    UPDATE board SET score = CAST(score - 1 AS SIGNED) WHERE team = 'TeamA'
    
        5
  •  0
  •   Piskvor left the building Rohit Kumar    14 年前
    ALTER TABLE board MODIFY score UNSIGNED INT;
    
        6
  •  0
  •   allnightgrocery    14 年前

    是否将列设置为无符号?

        7
  •  0
  •   lepe    14 年前

    如果使用事务数据库(如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;
    

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

    对于上述问题,它可能不是很有用,但它适用于其他情况,在这些情况下,您不能允许负数,并且需要提出错误,例如,如果您有购物车,并且需要更新所有选定产品的库存数量,则需要一次执行多个更新查询。上述任何解决方案都将跳过产品更新,不会返回任何错误消息。当然,有很多方法可以防止这种情况发生(比如锁定表并在更新之前读取数量),但这是一个快速(整洁)的解决方案。如果需要警告代码/说明,可以使用“显示警告”而不是“选择@@warning\u count”。