2015-10-20 57 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之前評估,所以這個初始化變量在使用之前。