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

494

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

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

Брайан Филд
источник

Ответы:

789
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
источник
8
Отлично! Колонны с оптимальными длинами и все! Я добавил слово temporaryтак create temporary table mytable as select ....
Брайан Филд
5
@ imperium2335, Может быть , вы должны попробовать следующее: create table t as select ... limit 0; alter table t engine=memory; insert into t select .... Или, возможно, вы можете изменить «движок новых таблиц по умолчанию». Я полагаю, что это можно сделать в переменной уровня сеанса. Еще лучше, используйте кнопку Задать вопрос в правом верхнем углу.
Брайан Филд
10
Это не требует знания имен столбцов и их типов, что стало причиной того, что спрашивающий не хотел создавать таблицы.
psparrow
30
Вы можете использовать это так, CREATE TEMPORARY TABLE IF NOT EXISTS table2 LIKE table1если не хотите копировать данные, просто структурируйте
dzona
1
что вы подразумеваете под сессией?
Саурабх Чандра Патель
137

В дополнение к ответу 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

RafaSashi
источник
3
Можно ли использовать Engine = Memory с таким синтаксисом?
DarkSide
6
@ DarkSide Да ДВИГАТЕЛЬ = ПАМЯТЬ также можно использовать. Смотрите следующий пример: blog.cnizz.com/2010/11/24/...
RafaSashi
1
В чем разница между MyISAM и механизмом памяти? Каковы преимущества памяти?
да
63

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

CREATE TEMPORARY TABLE t1 (select * from t2);
Rizon
источник
1
Это более объективно для копирования данных! Большой!
Рафаэль Гомес Франциско
54

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

CREATE TEMPORARY TABLE temp1 ENGINE=MEMORY 
as (select * from table1)
крестоносец
источник
39

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

Cris
источник
0
CREATE TEMPORARY TABLE IF NOT EXISTS to_table_name AS (SELECT * FROM from_table_name)
user11949964
источник