如何防止MySQL用户定义的变量冲突

时间:2015-10-20 12:35:37

标签: mysql sql node.js

我有一个node.js服务器,它使用node-mysql连接池来查询MySQL数据库。

我需要进行SELECT查询,该查询使用用户定义的变量来添加前一行的总和。在查询之前,我SET将变量初始化为0。

SET @sum:=0;
SELECT *, @sum := @sum + `value` AS SUM FROM `table`;

查询按预期工作,但我担心如果同时向我的节点服务器发出多个请求会发生什么。服务器将进行多次查询。它们是否会相互碰撞并相互影响,每个都会增加相同的变量?如果是,我该如何防止这种情况?

最好的情况是将变量的范围限制为只有一个SELECT查询。这样我就可以删除SET语句并将@sum包裹在ISNULL中。所以结果将是

SELECT *, @sum := ISNULL(@sum,0) + `value` AS SUM FROM `table`;

但我不知道如何限制范围,因此在此查询结束时@sum保留在结束值,对于下一个查询,它不是{{1}所以它不再从0递增。

无论如何,我可以保留null,但需要确保使用相同连接的多个查询不会相互影响。我不知道MySQL如何处理查询,所以这可能不是问题,但我需要确定。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您不必担心增加相同数字的不同查询。不同的查询在不同的线程或进程中运行,需要一些工作才能让它们共享数据。

但是,您只能使用一个语句编写查询:

SELECT t.*, @sum := @sum + `value` AS SUM
FROM `table` t CROSS JOIN
     (SELECT @sum := 0) params;

MySQL确保在FROM之前评估SELECT子句,因此在使用变量之前对其进行初始化。