簡體   English   中英

MySQL創建多個臨時表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM