mySQL 创建多个临时表

标签 mysql multithreading temp-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

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

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

最佳答案

回答具体问题:最简单的解决方案是每个线程使用不同的数据库连接,因为临时表是 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/

相关文章:

mysql - Mysql 脚本错误 1071 - 无法添加唯一或更改引擎

swift - NSManagedObject 不是故障,但应用程序在后台线程上访问它时崩溃

SQL "WITH"性能和临时表(可能为 "Query Hint"以简化)

mysql - 同一张表上的多个连接与计数

java - 如何获取数据库中的第一个空白行?

mysql - 使用 JOIN 进行 MySQL 查询并获取默认值(如果其中一些不存在)

函数可以锁定互斥量吗?

java - 使用多个并发线程执行一组测试方法

python - 如何使用 sqlalchemy 为现有表创建临时表?

sql-server-2008 - #Table 有歧义