MYSQL:用于更新增量值并存储返回值的查询

MYSQL:用于更新增量值并存储返回值的查询,mysql,Mysql,我有一个查询来减去数据库中存储的值 UPDATE tablename SET available = IF( available > 0, available - " . $var . ", 0 ) , purchases = purchases + 1 WHERE condition 是否可以在不进行新选择的情况下获得可用字段的新值,然后对性能进行惩罚?我还没有测试过这段代码,但我确信它可以工作 update语句不会返回结果集,但是您可以设置@var变量并从中进行选择 UP

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

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

是否可以在不进行新选择的情况下获得可用字段的新值,然后对性能进行惩罚?

我还没有测试过这段代码,但我确信它可以工作

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。

您仍然需要一个额外的select,但它不需要查询数据库,它只需要从内存中检索@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
或者类似的。您可以使用
selectregisterpurchase(1234,2)调用它。这可以与@Johan的解决方案相结合,以实现更大的正义

编辑:


这里有一个链接:。

谢谢约翰!我不得不对你的建议稍加修改。最后,我使用的查询是:
updatetablename SET available=@fastpeek:=IF(available>0,
+1,这将执行得更快,因为您保存了对数据库的额外调用