MYSQL:查询以更新增量值并存储返回值

时间:2011-09-27 12:41:41

标签: mysql

我有一个查询来减去存储在数据库中的值。

UPDATE tablename SET 
 available = IF( available > 0, available - " . $var . ", 0 ) , 
 purchases = purchases + 1 
 WHERE condition

是否可以在不制作新SELECT的情况下获得字段可用的新值,然后惩罚性能?

2 个答案:

答案 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。