我有一個查詢來減去存儲在數據庫上的值。MYSQL:查詢更新增量值並存儲返回值
UPDATE tablename SET
available = IF(available > 0, available - " . $var . ", 0) ,
purchases = purchases + 1
WHERE condition
是更多鈔票拿到場可用的新的價值,而不作出新的選擇,然後懲罰的表現?
我有一個查詢來減去存儲在數據庫上的值。MYSQL:查詢更新增量值並存儲返回值
UPDATE tablename SET
available = IF(available > 0, available - " . $var . ", 0) ,
purchases = purchases + 1
WHERE condition
是更多鈔票拿到場可用的新的價值,而不作出新的選擇,然後懲罰的表現?
我還沒有測試此代碼,但我
87587%
確保它工作。
更新語句不返回一個結果,但是你可以設置一個變量@var並從該選擇。
UPDATE tablename
SET
available = @fastpeek:= IF(available > 0, available - " . $var . ", 0)
,purchases = purchases + 1
WHERE condition
LIMIT 1;
SELECT @fastpeek as available_in_update;
這將打破,如果你更新但超過1行:更新超過1行時,@fastpeek將只顯示最後一次更新。因此,限制1.
你仍然需要額外的選擇,但它不需要查詢數據庫,它只會從內存中檢索@var。
你可以使用MySQL用戶定義函數:
CREATE FUNCTION registerPurchase(idParam INT, qty INT)
RETURNS INT
BEGIN
DECLARE avail INT, purc INT,
SELECT available, purchases INTO avail, purc FROM tablename WHERE id = idParam;
SET avail = IF(avail > 0, avail - qty, 0);
SET purc = purc - 1;
UPDATE tablename SET
available = avail,
purchases = purc
WHERE id = idParam;
RETURN avail;
END
或者類似的東西。例如,您可以使用SELECT registerPurchase(1234, 2);
來調用它。這可以與@ Johan的解決方案相結合,以實現更大的正義。
編輯:
這裏有一個鏈接:http://dev.mysql.com/doc/refman/5.6/en/create-procedure.html。
+1,因爲你保存到數據庫的額外調用,甚至會更快地執行, – Johan
謝謝Johan!我不得不對你的精彩建議做一些調整。最後,我使用的查詢是:'UPDATE表名 SET 可用= @ fastpeek:= IF(可> 0,...' – Crazystress