2015-10-20 56 views
1

我有一个node.js服务器,它使用node-mysql连接池来查询MySQL数据库。如何防止MySQL用户定义的变量碰撞

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

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

查询按预期工作,但我很担心,如果有在同一时间多个请求我的节点服务器会发生什么。服务器将进行多个查询。他们会碰撞并相互影响,每增加一个变量吗?如果是的话,我该如何预防呢?

最好的情况是将变量的范围限制在一个SELECT查询中。这将允许我删除SET声明并在ISNULL中包装@sum。因此,结果将是

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

但我不知道如何使这个查询@sum年底末值和下一个查询左极限范围内,它不是null等没有关系再次从0递增。

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

谢谢你的帮助!

回答

2

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

但是,你可以只使用一个语句编写查询:

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

的MySQL不保证该FROM子句的SELECT之前评估,所以这个初始化变量在使用之前。