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

#mysql #select #temp-tables #create-table #derived-table

#mysql #выберите #временные таблицы #create-table #производная таблица

Вопрос:

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

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

Ответ №1:

 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.

Комментарии:

1. Идеально! Столбцы с оптимальной максимальной длиной и все такое! Я добавил слово temporary so create temporary table mytable as select ... .

2. @imperium2335, возможно, вам следует попробовать следующее: create table t as select ... limit 0; alter table t engine=memory; insert into t select ... . Или, возможно, вы можете изменить «механизм создания новых таблиц по умолчанию». Я полагаю, это можно сделать в переменной уровня сеанса. А еще лучше, используйте кнопку Задать вопрос в правом верхнем углу.

3. Для этого не требуется знать имена и типы столбцов, что было причиной, по которой спрашивающий хотел избежать использования Create Table.

4. вы можете использовать это следующим образом CREATE TEMPORARY TABLE IF NOT EXISTS table2 LIKE table1 , если вы не хотите копировать данные, просто структурируйте

5. что вы подразумеваете под сеансом?

Ответ №2:

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

Комментарии:

1. Можно ли использовать Engine = Memory также с таким синтаксисом?

2. @DarkSide Да, ДВИЖОК = ПАМЯТЬ также может быть использована. Смотрите следующий пример: blog.cnizz.com/2010/11/24 /…

3. в чем разница между MyISAM и Memory engine? каковы преимущества памяти?

4. @yeahman Движок MyISAM хранит данные на диске, но механизм памяти хранит их в оперативной памяти. P.S: механизм памяти не поддерживает transactions , только блокировку на уровне таблицы… подробнее: dba.stackexchange.com/questions/1811 /…

Ответ №3:

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

 CREATE TEMPORARY TABLE t1 (select * from t2);
  

Комментарии:

1. Это более объективно для копирования данных! Отлично!

Ответ №4:

Движок должен быть перед select:

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

Ответ №5:

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

Ответ №6:

Насколько я понимаю, инструкция SELECT будет работать с временной таблицей, если вы используете ее в чем-то вроде phpMyAdmin, но после этого ВЫБОРА временная таблица исчезнет. Это означает, что сначала настройте именно то, что вы хотите с этим сделать, и не просматривайте никаких результатов, пока ваши инструкции ‘action’, которые изменяют данные (УДАЛЯЮТ, ОБНОВЛЯЮТ), не будут завершены.