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

371

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

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

Теги:
select
temp-tables
create-table
derived-table

5 ответов

600
Лучший ответ
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 отображается только для текущего сеанса и автоматически отбрасывается, когда сеанс закрыт. Это означает, что два разных сеанса могут использовать одно и то же имя временной таблицы, не конфликтуя друг с другом или с существующей таблицей без тегов с тем же именем. (Существующая таблица скрыта до тех пор, пока временная таблица не будет удалена.) Чтобы создать временные таблицы, вы должны иметь привилегию CREATE TEMPORARY TABLES.

  • 8
    Отлично! Колонны с оптимальными длинами и все! Я добавил слово temporary поэтому create temporary table mytable as select ...
  • 0
    Как бы вы указали движок этой таблицы? например, ПАМЯТЬ Я попытался ДВИГАТЕЛЬ = ПАМЯТЬ, но это дает мне синтаксическую ошибку.
Показать ещё 10 комментариев
118

В дополнение к ответу 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 с таким синтаксисом?
  • 6
    @ DarkSide Да ENGINE = MEMORY также можно использовать. Смотрите следующий пример: blog.cnizz.com/2010/11/24/…
Показать ещё 2 комментария
47

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

CREATE TEMPORARY TABLE t1 (select * from t2);
  • 0
    Это более объективно для копирования данных! Большой!
44

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню