我有一个node.js服务器,它使用node-mysql连接池来查询MySQL数据库。
我需要进行 SELECT
查询,该查询使用用户定义的变量来添加先前行的总和。在查询之前,我SET
变量将其初始化为0。
SET @sum:=0;
SELECT *, @sum := @sum + `value` AS SUM FROM `table`;
查询按预期工作,但我担心如果同时向我的 Node 服务器发出多个请求会发生什么。服务器将进行多次查询。它们会相互碰撞并影响彼此,各自增加相同的变量吗?如果是,我该如何防止这种情况发生?
最好的情况是将变量的范围限制为一个 SELECT
查询。这将允许我删除 SET
语句并将 @sum
包装在 ISNULL
中。所以结果是
SELECT *, @sum := ISNULL(@sum,0) + `value` AS SUM FROM `table`;
但我不知道如何限制范围,因此在此查询结束时 @sum
保留在最终值中,对于下一个查询,它不是 null
因此它不会再次从 0 开始递增。
无论如何,我可以保留 SET
但需要确保使用同一连接的多个查询不会相互影响。我不知道 MySQL 到底是如何处理查询的,所以也许这根本不是问题,但我需要确定。
感谢您的帮助!
最佳答案
您不必担心不同的查询会增加相同的数字。不同的查询运行在不同的线程或进程中,需要做一些工作才能让它们共享数据。
但是,您可以仅使用单个语句编写查询:
SELECT t.*, @sum := @sum + `value` AS SUM
FROM `table` t CROSS JOIN
(SELECT @sum := 0) params;
MySQL 确实保证 FROM
子句在 SELECT
之前进行计算,因此这会在使用变量之前对其进行初始化。
关于mysql - 如何防止MySQL用户定义变量冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33236846/