我试图运行下面的简单测试 - 创建临时表,然后UNIONing两种不同的选择:无法在临时表上创建UNION ALL?
CREATE TEMPORARY TABLE tmp
SELECT * FROM people;
SELECT * FROM tmp
UNION ALL
SELECT * FROM tmp;
却得到了一个#1137 - Can't reopen table: 'tmp'
我以为临时表被认为持续会话。这里有什么问题?
我试图运行下面的简单测试 - 创建临时表,然后UNIONing两种不同的选择:无法在临时表上创建UNION ALL?
CREATE TEMPORARY TABLE tmp
SELECT * FROM people;
SELECT * FROM tmp
UNION ALL
SELECT * FROM tmp;
却得到了一个#1137 - Can't reopen table: 'tmp'
我以为临时表被认为持续会话。这里有什么问题?
此错误表明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
这可行,但复制临时表似乎没有比从源创建2更好? – Yarin
当前客户端会话终止时,临时表会被删除。参见http://www.tutorialspoint.com/mysql/mysql-temporary-tables.htm – heretolearn
我想出了一个很好的[回答](http:// stackoverflow.com/a/12122220/165673)基于此 - 感谢您在正确的方向转向我 – Yarin
由于TEMPORARY
Table Problems下记载:
你不能指
TEMPORARY
表不止一次在相同的查询。例如,下面不工作:mysql> SELECT * FROM temp_table, temp_table AS t2;
ERROR 1137: Can't reopen table: 'temp_table'也是这个错误,如果你在不同的别名存储函数多次引用一个临时表,即使发生在函数中不同的语句引用发生。
想通了感谢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;
或者只是'创建临时表tmp选择*从人联盟所有选择*从人'? – eggyal
的[逛逛MySQL的 “不能重新打开表” 错误]可能重复(http://stackoverflow.com/questions/343402/getting-around-mysql-cant-reopen-table-error) – LittleBobbyTables
@ LittleBobby-在那一个中看不到任何适用的解决方案 – Yarin
需要使用多少个不同的临时表..? – heretolearn