在临时桌上不能UNION ALL吗?

时间:2012-08-25 12:33:54

标签: mysql sql

我试图运行以下简单测试 - 创建临时表,然后UNIONing两个不同的选择:

CREATE TEMPORARY TABLE tmp 
SELECT * FROM people;

SELECT * FROM tmp
UNION ALL
SELECT * FROM tmp;

但获得#1137 - Can't reopen table: 'tmp'

我认为临时表应该会持续会议。这里的问题是什么?

4 个答案:

答案 0 :(得分:15)

此错误表示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;

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

http://dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html

http://www.mysqlrepair.org/mysqlrepair/cant-reopen-table.php

答案 1 :(得分:7)

通过sshekar's回答弄清楚 - 这种情况下的解决方案是

  1. 创建一个空的临时表
  2. 将我们想要的结果单独插入表中
  3. 查询临时表
  4. <强> 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; 
    

    (见Using MySQL Temporary Tables to save your brain

答案 2 :(得分:6)

正如TEMPORARY Table Problems所述:

  

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

mysql> SELECT * FROM temp_table, temp_table AS t2;
ERROR 1137: Can't reopen table: 'temp_table'
     

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

答案 3 :(得分:0)

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

here所述,该限制存在于Ubuntu 16.04,mysql 5.7中,就像上面报道的eggyal一样。该错误/功能已记录here,并被忽略了十多年。同样,它也针对mariadb进行了记录,并已在版本10.2.1中解决。由于Ubuntu 16.04LTS使用mariadb 10.0,因此在不升级到18.04等版本的情况下无法轻松使用此功能。您必须从外部存储库下载并直接安装。