26

我正在尝试运行以下简单的测试——创建一个临时表,然后合并两个不同的选择:

CREATE TEMPORARY TABLE tmp 
SELECT * FROM people;

SELECT * FROM tmp
UNION ALL
SELECT * FROM tmp;

但是得到一个#1137 - Can't reopen table: 'tmp'

我认为临时表应该持续会话。这里有什么问题?

4

4 回答 4

18

此错误表明 MySQL 表管理临时表的方式已更改,这反过来会影响连接、联合以及子查询。要修复 MySQL 错误“无法重新打开表”,请尝试以下解决方案:

mysql> CREATE TEMPORARY TABLE tmp_journals_2 LIKE tmp_journals;

Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO tmp_journals_2 SELECT * FROM tmp_journals;

在此之后,您可以执行联合操作。


有用的阅读

于 2012-08-25T12:40:56.157 回答
10

多亏了sshekar 的回答才想出来——这种情况下的解决方案是

  1. 创建一个空的临时表
  2. 将我们要UNION的结果分别插入表中
  3. 查询临时表

SQL:

CREATE TEMPORARY TABLE tmp LIKE people;

INSERT INTO tmp SELECT * FROM people; /* First half of UNION */
INSERT INTO tmp SELECT * FROM people; /* Second half of UNION */
SELECT * FROM tmp; 

(请参阅使用 MySQL 临时表来节省您的大脑

于 2012-08-25T13:04:40.190 回答
6

TEMPORARY表问题中所述:

您不能TEMPORARY在同一查询中多次引用表。例如,以下内容不起作用:

mysql> SELECT * FROM temp_table, temp_table AS t2;
错误 1137:无法重新打开表:'temp_table'

如果您在存储函数中以不同别名多次引用临时表,也会发生此错误,即使引用发生在函数内的不同语句中也是如此。

于 2012-08-25T12:39:43.947 回答
0

因为其他人可能会跳过这个问题/解决方案线程......如果他们有旧的 Ubuntu 16.04LTS 机器或类似机器。

该限制存在于 Ubuntu 16.04、mysql 5.7 中,如此所述,如上面报道的 eggyal。错误/功能被记录在这里,并被忽视了十多年。同样,它也记录在mariadb中,并在版本 10.2.1 中得到解决。由于 Ubuntu 16.04LTS 使用 mariadb 10.0,如果不升级到 18.04 等,该功能就无法轻松实现。您必须从外部 repo 下载并直接安装。

于 2020-02-11T14:07:43.130 回答