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