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,这将执行得更快,因为您保存了对数据库的额外调用