多次加入 temporary table
。收到此错误:
Error Code: 1137. Can't reopen table: 'a'
我用谷歌搜索了一下,发现在查询中多次引用相同的 temporary table
存在某种限制。谁能解释为什么存在这种限制?
以下是会导致此错误的简单查询示例:
CREATE TEMPORARY TABLE foo
SELECT * FROM shopify_us limit 10;
SELECT *
FROM (
SELECT *
FROM shopify_us
LIMIT 10
) boo
LEFT JOIN foo a ON a.customer_id = boo.customer_id
LEFT JOIN foo b on b.customer_id = boo.customer_id
但是,如果我只是删除第二个连接,则不再遇到错误。
答案 0 :(得分:2)
限制是你不能在同一个查询中多次引用一个临时表。例如,不能对临时表进行自联接。但是您可以通过多个后续查询使用一个临时表。
这是 MySQL 服务器代码中解释原因的注释,就在它引发此错误之前:
/*
We're trying to use the same temporary table twice in a query.
Right now we don't support this because a temporary table is always
represented by only one TABLE object in THD, and it can not be
cloned. Emit an error for an unsupported behaviour.
*/
https://github.com/mysql/mysql-server/blob/8.0/sql/sql_base.cc#L7284-L7289
THD
指的是会话范围信息的数据结构。临时表的范围仅限于创建它们的会话。它们不是对可由多个会话共享的表的引用。
换句话说,这只是跟踪临时表的数据结构的代码限制。
还可以将其历史作为可追溯到 2005 年的错误报告:https://bugs.mysql.com/bug.php?id=10327
在 MySQL 8.0 中有一个解决方法:您可以使用公共表表达式来代替,用于某些您可能使用临时表的用途。