我有一个查询来减去存储在数据库中的值。
UPDATE tablename SET
available = IF( available > 0, available - " . $var . ", 0 ) ,
purchases = purchases + 1
WHERE condition
是否可以在不制作新SELECT的情况下获得字段可用的新值,然后惩罚性能?
答案 0 :(得分:2)
您可以使用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 :(得分:1)
我没有测试过这段代码,但我 87,587%确定它有效。
update语句不返回结果集,但是您可以设置@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。