为什么一个临时表只允许被引用一次?

时间:2021-04-23 22:10:23

标签: mysql sql

多次加入 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

但是,如果我只是删除第二个连接,则不再遇到错误。

1 个答案:

答案 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 中有一个解决方法:您可以使用公共表表达式来代替,用于某些您可能使用临时表的用途。

相关问题