Не может UNION ALL на временной таблице?
Я пытаюсь запустить следующую простую тестовую таблицу temp, а затем UNIONing два разных выбора:
CREATE TEMPORARY TABLE tmp
SELECT * FROM people;
SELECT * FROM tmp
UNION ALL
SELECT * FROM tmp;
Но получим #1137 - Can't reopen table: 'tmp'
Я думал, что временные таблицы должны были длиться сессии. В чем проблема?
Ответы
Ответ 1
Эта ошибка указывает, что был изменен способ управления таблицами Mysql временных таблиц, что в свою очередь влияет на объединения, союзы и подзапросы. Чтобы исправить ошибку mysql cant reopen table, попробуйте выполнить следующее решение:
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
Как описано в TEMPORARY
Проблемы с таблицами:
Вы не можете ссылаться на таблицу TEMPORARY
несколько раз в том же запросе. Например, следующее не работает:
mysql> SELECT * FROM temp_table, temp_table AS t2;
ERROR 1137: Can't reopen table: 'temp_table'
Эта ошибка также возникает, если вы ссылаетесь на временную таблицу несколько раз в хранимой функции под разными псевдонимами, даже если ссылки встречаются в разных операторах внутри функции.
Ответ 3
Выяснилось, что ответ sshekar - решение в этом случае будет
- Создать пустую таблицу temp
- Вставьте результаты, которые мы хотим в UNION в таблицу отдельно
- Запросить таблицу temp
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;
(См. Использование временных таблиц MySQL для сохранения вашего мозга)