首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >绕过MySQL "Can't reopen table“错误

绕过MySQL "Can't reopen table“错误
EN

Stack Overflow用户
提问于 2008-12-05 10:18:34
回答 8查看 90.5K关注 0票数 107

我现在正忙于实现一个过滤器,我需要为每个要过滤的“标签”生成一个内部连接子句。

问题是,在执行了一大堆SQL之后,我有了一个表,其中包含了进行选择所需的所有信息,但每次生成的内部连接都需要它

这基本上看起来是这样的:

代码语言:javascript
运行
复制
SELECT
    *
FROM search
INNER JOIN search f1 ON f1.baseID = search.baseID AND f1.condition = condition1
INNER JOIN search f2 ON f2.baseID = search.baseID AND f2.condition = condition2
...
INNER JOIN search fN ON fN.baseID = search.baseID AND fN.condition = conditionN

这是可行的,但我更希望“搜索”表是临时的(如果它不是一个普通的表,它可以小几个数量级),但这给了我一个非常恼人的错误:Can't reopen table

一些研究将我引向this bug report,但是MySQL的人似乎并不关心这样的基本特性(多次使用表)不适用于临时表。我在这个问题上遇到了很多可伸缩性问题。

有没有可行的解决办法,不需要我管理大量可能的临时但非常真实的表,或者让我维护一个包含所有数据的巨型表?

致以良好的问候,克里斯

附加内容

GROUP_CONCAT答案在我的情况下不起作用,因为我的条件是按特定顺序的多个列,它会使我需要为AND的内容进行OR运算。但是,它确实帮助我解决了之前的一个问题,所以现在不再需要表,不管是不是temp。我们只是认为对于我们的问题来说太通用了。滤镜的整个应用现在已经从大约一分钟恢复到不到四分之一秒。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2020-05-25 13:31:54

如果切换到MariaDB (MySQL的一个分支)是可行的--从版本10.2.1:https://jira.mariadb.org/browse/MDEV-5535开始,这个麻烦就被修复了。

票数 2
EN

Stack Overflow用户

发布于 2013-01-28 18:28:00

一个简单的解决方案是复制临时表。如果表相对较小,则效果很好,临时表通常就是这种情况。

票数 141
EN

Stack Overflow用户

发布于 2008-12-07 06:03:12

没错,MySQL docs说:“您不能在同一查询中多次引用TEMPORARY表。”

下面是另一个查询,它应该找到相同的行,虽然匹配行的所有条件不会在单独的列中,但它们将在逗号分隔的列表中。

代码语言:javascript
运行
复制
SELECT f1.baseID, GROUP_CONCAT(f1.condition)
FROM search f1
WHERE f1.condition IN (<condition1>, <condition2>, ... <conditionN>)
GROUP BY f1.baseID
HAVING COUNT(*) = <N>;
票数 51
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/343402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档