2013-11-26 46 views
0

嘿傢伙我有一個MySQL查詢,減少股票每按一下按鈕,遞減在MySQL停在0

查詢

UPDATE Animals 
    SET Stock = Stock - 1 
WHERE Specie ='{1}' and Country ='{0}'   

問題是,我希望它停止在0和沒有進入負面是有辦法做到這一點?

回答

2

這應該工作:

 

"UPDATE Animals SET Stock = Stock - 1 WHERE Specie ='{1}' and Country ='{0}' and Stock >0" 
 
+0

如果它已經= 0,它會變成負數。 – zerkms

+0

nice catch @zerkms;它已被更新。謝謝。 –

5
UPDATE Animals 
    SET Stock = Stock - 1 
WHERE Specie ='{1}' and Country ='{0}' AND Stock > 0 

所以限制了行,從而具有Stock > 0明確

+0

是的,就像它更好那麼我的'IF(..)' – Wrikken

+0

同意我儘量不要使用IF(..)',除非我絕對需要 –

+0

確保你檢查結果(行數改變)以確保物品在訂購時實際存貨。 –

0

... SET Stock = IF(Stock < 1, Stock, Stock -1)...

1

,以防止過度的排序,你可能要檢查,看是否有實際存貨,保留備用,然後通過交易做出決定:

START TRANSACTION; 
SELECT Stock 
    FROM Animals 
    WHERE Specie ='{1}' and Country ='{0}' AND Stock > 0 
    FOR UPDATE; 

如果您沒有獲得記錄,那麼股票是< = 0.如果您獲得了一條記錄,那麼您已經有剩餘的股票數量。

現在更新:

UPDATE Animals SET Stock = Stock - 1 WHERE Specie ='{1}' and Country ='{0}'; 
COMMIT; 

否則,

ROLLBACK; 

你要做到這一點在同一個會話(連接)。

+0

即使在非交易方式下,它也可以完美地工作。 'UPDATE'會鎖定該行以更新它,所以如果存在'AND St​​ock> 0'謂詞,那麼2次會話就不可能減少該值 – zerkms