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