2012-08-25 23 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