Подтвердить что ты не робот

Не может 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'

Я думал, что временные таблицы должны были длиться сессии. В чем проблема?

4b9b3361

Ответ 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 для сохранения вашего мозга)