2012-08-25 21 views
17

我试图运行下面的简单测试 - 创建临时表,然后UNIONing两种不同的选择:无法在临时表上创建UNION ALL?

CREATE TEMPORARY TABLE tmp 
SELECT * FROM people; 

SELECT * FROM tmp 
UNION ALL 
SELECT * FROM tmp; 

却得到了一个#1137 - Can't reopen table: 'tmp'

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

+1

的[逛逛MySQL的 “不能重新打开表” 错误]可能重复(http://stackoverflow.com/questions/343402/getting-around-mysql-cant-reopen-table-error) – LittleBobbyTables

+1

@ LittleBobby-在那一个中​​看不到任何适用的解决方案 – Yarin

+0

需要使用多少个不同的临时表..? – heretolearn

回答

14

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

这可行,但复制临时表似乎没有比从源创建2更好? – Yarin

+0

当前客户端会话终止时,临时表会被删除。参见http://www.tutorialspoint.com/mysql/mysql-temporary-tables.htm – heretolearn

+0

我想出了一个很好的[回答](http:// stackoverflow.com/a/12122220/165673)基于此 - 感谢您在正确的方向转向我 – Yarin

6

由于TEMPORARY Table Problems下记载:

你不能指TEMPORARY表不止一次在相同的查询。例如,下面不工作:

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

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

+7

真的吗?这似乎吹掉了它们90%的有用性。我错过了一个明显的解决方法吗? – Yarin

+0

那么,你可以访问他们在不同的查询... –

+0

Sam-你会如何做到这一点? – Yarin

6

想通了感谢sshekar's答案 - 在这种情况下,解决办法是

  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; 

(见Using MySQL Temporary Tables to save your brain

+3

或者只是'创建临时表tmp选择*从人联盟所有选择*从人'? – eggyal