Создайте временную таблицу в операторе SELECT без отдельного CREATE TABLE

Можно ли создать временную (только для сеанса) таблицу из оператора выбора без использования оператора создания таблицы и указания каждого типа столбца? Я знаю, что производные таблицы способны на это, но они являются временными (только для операторов), и я хочу использовать их повторно.

Это сэкономило бы время, если бы мне не нужно было писать команду создания таблицы и согласовывать список столбцов и список типов.

7 ответов

Решение
CREATE TEMPORARY TABLE IF NOT EXISTS table2 AS (SELECT * FROM table1)

Из руководства на http://dev.mysql.com/doc/refman/5.7/en/create-table.html

Вы можете использовать ключевое слово TEMPORARY при создании таблицы. Таблица TEMPORARY видна только текущему сеансу и автоматически удаляется при закрытии сеанса. Это означает, что два разных сеанса могут использовать одно и то же временное имя таблицы, не конфликтуя друг с другом или с существующей, не являющейся TEMPORARY, таблицей с одинаковым именем. (Существующая таблица скрыта до тех пор, пока временная таблица не будет удалена.) Для создания временных таблиц у вас должна быть привилегия CREATE TEMPORARY TABLES.

В дополнение к ответу psparrow, если вам нужно добавить индекс во временную таблицу, сделайте:

CREATE TEMPORARY TABLE IF NOT EXISTS 
  temp_table ( INDEX(col_2) ) 
ENGINE=MyISAM 
AS (
  SELECT col_1, coll_2, coll_3
  FROM mytable
)

Это также работает с PRIMARY KEY

Используйте этот синтаксис:

CREATE TEMPORARY TABLE t1 (select * from t2);

Двигатель должен быть перед выбором:

CREATE TEMPORARY TABLE temp1 ENGINE=MEMORY 
as (select * from table1)

ENGINE=MEMORY не поддерживается, если таблица содержит BLOB/TEXT столбцы

CREATE TEMPORARY TABLE IF NOT EXISTS to_table_name AS (SELECT * FROM from_table_name)

Насколько я понимаю, оператор SELECT будет работать с временной таблицей, если вы используете его в чем-то вроде phpMyAdmin, но после этого SELECT временная таблица исчезнет. Это означает, что сначала настройте именно то, что вы хотите с ним делать, и не просматривайте никаких результатов до тех пор, пока ваши операторы «действия», которые изменяют данные (DELETE, UPDATE), не будут завершены.

Другие вопросы по тегам