繁体   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