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

标签 mysql sql node.js

我有一个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/

相关文章:

c# - 为什么要创建外键约束?

Mysql 选择具有相同 id 的行(3 个表)

Node.js - 使用 Redis 原子更新进行扩展

Mysql 删除与连接和限制

Mysql设置SYSTEM时区

MySQL order by optimization with joins and wheres

sql - 如何存储已执行过程的临时表?

Node.js:短路由命名对 SEO 友好吗?

javascript - 通过 Maps Javascript 解析

mysql - 根据另一行获取10个最相似的行