2010-06-01 137 views
2

我有我的數據庫中從0開始的數據。如何防止Mysql中的負數

我的php會根據用戶的輸入將數據加1或-1。 我的問題是,如果數據爲0,並且用戶嘗試減1。數據變成4294967295 這是INT數據類型的最大值。是否有反正使數據 停留在0即使用戶要求-1?感謝您的答覆..

我的SQL命令是類似下面

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

回答

9

是..

UPDATE board SET score = score - 1 WHERE team = 'TeamA' AND score > 0 
3
update board set score=score-1 
where team='TeamA' 
and score > 0 
+0

感謝您的回答。 +1:D – FlyingCat 2010-06-01 15:56:33

0
ALTER TABLE board MODIFY score UNSIGNED INT; 
+0

它已經是一個unsigned int;他試圖阻止他的UPDATE從一個有0分的隊伍中下流(標題無可否認地令人困惑) – 2010-06-01 15:45:50

+0

他說他得到了4294967295,所以我認爲它是未簽名的,但是環繞四周。 – 2010-06-01 15:47:09

+0

啊,傻了。爲我沒有正確閱讀而服務我 – Piskvor 2010-06-01 15:56:39

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」。

1

到傑裏的問題的其他解決方案是使用MySQL的「CAST」(如果要減少數量,直到它達到零(但沒有更多)):

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