我試圖運行下面的簡單測試 - 創建臨時表,然後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