gpt4 book ai didi

mySQL 创建多个临时表

转载 作者:行者123 更新时间:2023-11-29 03:23:03 25 4
gpt4 key购买 nike

我在 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

这很好用。但是,我遇到的问题是这是一个多线程应用程序,当多个线程调用此存储过程时,它们开始共享同一个临时表,这会扰乱我正在尝试编译的统计信息。

有没有办法将唯一的表名应用于存储过程的每次调用,或者将临时表的范围限制为存储过程的那个实例?

最佳答案

回答具体问题:最简单的解决方案是每个线程使用不同的数据库连接,因为临时表是 session (connection) specific :

You can use the TEMPORARY keyword when creating a table. A TEMPORARY table is visible only to the current session, and is dropped automatically when the session is closed. This means that two different sessions can use the same temporary table name without conflicting with each other or with an existing non-TEMPORARY table of the same name.

但是,在检查了实际代码之后,我建议根本不要使用临时表,使用带有子查询的单个查询:

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'

关于mySQL 创建多个临时表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40804749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com