我试图运行以下简单测试 - 创建临时表,然后UNIONing两个不同的选择:
CREATE TEMPORARY TABLE tmp
SELECT * FROM people;
SELECT * FROM tmp
UNION ALL
SELECT * FROM tmp;
但获得#1137 - Can't reopen table: 'tmp'
我认为临时表应该会持续会议。这里的问题是什么?
答案 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回答弄清楚 - 这种情况下的解决方案是
<强> 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;
答案 2 :(得分:6)
您不能在同一查询中多次引用
TEMPORARY
表。例如,以下内容不起作用:mysql> SELECT * FROM temp_table, temp_table AS t2;
ERROR 1137: Can't reopen table: 'temp_table'如果在不同别名下的存储函数中多次引用临时表,也会发生此错误,即使引用发生在函数内的不同语句中也是如此。
答案 3 :(得分:0)