我有一个查询来减去存储在数据库上的值。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