Создать временную таблицу в операторе 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.


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


3
Можно ли использовать Engine = Memory с таким синтаксисом?
DarkSide

6
@ DarkSide Да ДВИГАТЕЛЬ = ПАМЯТЬ также можно использовать. Смотрите следующий пример: blog.cnizz.com/2010/11/24/...
RafaSashi

1
В чем разница между MyISAM и механизмом памяти? Каковы преимущества памяти?
да



39

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.