如何防止MySQL用户定义的variables碰撞
我有一个node.js服务器,它使用node-mysql连接池来查询MySQL数据库。
我需要使SELECT
用户定义variables的查询添加以前的行的总和。 在查询之前,我将该variables初始化为0。
SET @sum:=0; SELECT *, @sum := @sum + `value` AS SUM FROM `table`;
该查询按预期工作,但我担心如果同时有多个请求到我的节点服务器会发生什么。 服务器将进行多个查询。 他们会碰撞和相互影响,每增加一个variables? 如果是的话,我怎么能阻止呢?
最好的情况是将variables的范围限制在一个SELECT
查询中。 这将允许我删除SET
语句并在ISNULL
包装@sum
。 所以结果会是
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
之前被计算,因此在使用它之前初始化variables。