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

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

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


person 700 Software    schedule 02.05.2011    source источник


Ответы (6)


CREATE TEMPORARY TABLE IF NOT EXISTS table2 AS (SELECT * FROM table1)

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

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

person psparrow    schedule 02.05.2011
comment
Идеально! Колонны с оптимальной максимальной длиной и все! Я добавил слово temporary так create temporary table mytable as select .... - person 700 Software; 02.05.2011
comment
Как бы вы указали движок этой таблицы? например ПАМЯТЬ Я пробовал ENGINE = MEMORY, но у меня возникла синтаксическая ошибка. - person imperium2335; 26.06.2012
comment
@ imperium2335, Возможно стоит попробовать следующее: create table t as select ... limit 0; alter table t engine=memory; insert into t select .... Или, возможно, вы можете изменить движок по умолчанию для новых таблиц. Я предполагаю, что это можно сделать в переменной уровня сеанса. А еще лучше использовать кнопку «Задать вопрос» в правом верхнем углу. - person 700 Software; 29.06.2012
comment
Как это отвечает на вопрос, когда явно используется Create Table. -1 - person John Riselvato; 08.02.2013
comment
Для этого не требуется знать имена и типы столбцов, что было причиной того, что спрашивающий не хотел использовать Create Table. - person psparrow; 09.02.2013
comment
@ Джон, я согласен. Это прекрасно отвечает на мой вопрос. - person 700 Software; 14.02.2013
comment
если это всего лишь временная таблица, она будет удалена? - person hearmeroar; 08.04.2014
comment
@GeorgeBailey Я действительно не знаю, как работает спецификация двигателя. Опасно ли не указывать? - person rschwieb; 29.05.2014
comment
@rschwieb, я считаю, что это совершенно безопасно. Для меня по умолчанию используется MyISAM, что, конечно, не вызовет никаких проблем. Если вам интересно, что было по умолчанию для вас, вы можете запустить create temporary table x, а затем показать create table x, и он покажет используемый движок. В будущем вам следует использовать Задать вопрос вместо добавить комментарий, потому что так вы обычно получаете более точные ответы. - person 700 Software; 30.05.2014
comment
вы можете использовать это так CREATE TEMPORARY TABLE IF NOT EXISTS table2 LIKE table1, если вы не хотите копировать данные, просто структурируйте - person dzona; 23.07.2014
comment
что вы имеете в виду под сеансом? - person Saurabh Chandra Patel; 23.11.2016
comment
@SaurabhChandraPatel под сеансами означает период времени, в течение которого активно текущее соединение с базой данных. При закрытии соединения - сессия тоже закрывается. - person Andrey Rudenko; 20.02.2018
comment
Боже, этот синтаксис такой лаконичный, читаемый и мощный. Я люблю это. - person Zimano; 22.11.2019

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

person RafaSashi    schedule 17.06.2013
comment
Можно ли использовать Engine = Memory с таким синтаксисом? - person DarkSide; 26.06.2013
comment
@DarkSide Да ENGINE = MEMORY также можно использовать. См. Следующий пример: blog.cnizz.com/2010/11/24/ - person RafaSashi; 26.07.2013
comment
в чем разница между MyISAM и движком памяти? каковы преимущества памяти? - person yeahman; 21.11.2018
comment
Механизм @yeahman MyISAM хранит данные на диске, а механизм памяти хранит их в ОЗУ. PS: механизм памяти не поддерживает transactions, только блокировку на уровне таблицы ... подробнее: dba.stackexchange.com/questions/1811/ - person parse; 13.01.2021

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

CREATE TEMPORARY TABLE t1 (select * from t2);
person rizon    schedule 06.12.2012
comment
Это более объективно для копирования данных! Большой! - person Rafael Gomes Francisco; 23.02.2017

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

CREATE TEMPORARY TABLE temp1 ENGINE=MEMORY 
as (select * from table1)
person Crusader    schedule 14.02.2013

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

person Cris    schedule 23.02.2013

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

person Pete855217    schedule 15.04.2021