[英]mySQL creating multiple temporary tables
我在mySQL中有一個存儲過程,該存儲過程從表中獲取數據的子集,並對臨時表中的該子集執行一些分析。 這是我的代碼:
CREATE PROCEDURE GetPortfolioStats
(
InIdx_i INT,
InStart_i INT,
InEnd_i INT
)
BEGIN
DECLARE myLimit INT;
DECLARE myOffset INT;
SET myLimit = InEnd_i - InStart_i + 1;
SET myOffset = InStart_i - 1;
CREATE TEMPORARY TABLE IF NOT EXISTS myTmpTable AS (SELECT * FROM Leases WHERE Portfolio_i = InIdx_i ORDER BY Index_i LIMIT myLimit OFFSET myOffset);
SET @Additive_i := (SELECT COUNT(Index_i) FROM myTmpTable WHERE ReviewType_vc = 'Additive');
DROP TABLE myTmpTable;
SELECT @Additive_i;
END; GO
這很好。 但是,我的問題是這是一個多線程應用程序,當多個線程調用此存儲的proc時,它們開始共享同一臨時表,這弄亂了我要編譯的統計信息。
是否可以將唯一的表名應用於存儲過程的每次調用,或者將臨時表的范圍限制為僅存儲過程的實例?
要回答這個特定問題:最簡單的解決方案是每個線程使用不同的數據庫連接,因為臨時表是特定於會話(連接)的 :
您可以在創建表時使用TEMPORARY關鍵字。 TEMPORARY表僅對當前會話可見,並且在關閉會話時會自動將其刪除。 這意味着兩個不同的會話可以使用相同的臨時表名稱,而不會彼此沖突或與現有的具有相同名稱的非TEMPORARY表沖突。
但是,在簽出實際代碼之后,我建議不要使用臨時表,而是將單個查詢與子查詢一起使用:
SELECT COUNT(Index_i)
FROM
(SELECT Index_i, ReviewType_vc
FROM Leases
WHERE Portfolio_i = InIdx_i
ORDER BY Index_i
LIMIT myLimit OFFSET myOffset) t
WHERE ReviewType_vc = 'Additive'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.