Utwórz tabelę tymczasową w instrukcji SELECT bez osobnej instrukcji CREATE TABLE

494

Czy można utworzyć tabelę tymczasową (tylko sesyjną) z instrukcji select bez użycia instrukcji create table i określenia każdego typu kolumny? Wiem, że tabele pochodne są w stanie to zrobić, ale są one super-tymczasowe (tylko instrukcje) i chcę ponownie użyć.

Zaoszczędziłbym czas, gdybym nie musiał pisać polecenia tworzenia tabeli i dopasować listę kolumn i listy typów.

Bryan Field
źródło

Odpowiedzi:

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

Z podręcznika na stronie http://dev.mysql.com/doc/refman/5.7/en/create-table.html

Podczas tworzenia tabeli można użyć słowa kluczowego TEMPORARY. Tabela TEMPORARY jest widoczna tylko dla bieżącej sesji i jest automatycznie usuwana po zamknięciu sesji. Oznacza to, że dwie różne sesje mogą korzystać z tej samej nazwy tabeli tymczasowej bez konfliktu między sobą lub z istniejącą tabelą inną niż TEMPORARY o tej samej nazwie. (Istniejąca tabela jest ukryta, dopóki tabela tymczasowa nie zostanie upuszczona). Aby utworzyć tabele tymczasowe, musisz mieć uprawnienie UTWÓRZ TABELE TYMCZASOWE.

psparrow
źródło
8
Doskonały! Kolumny o optymalnej maksymalnej długości i wszystkie! Dodałem słowo temporarytak create temporary table mytable as select ....
Bryan Field
5
@ imperium2335, Być może należy spróbować, co następuje: create table t as select ... limit 0; alter table t engine=memory; insert into t select .... A może możesz zmienić „domyślny silnik nowych tabel”. Wyobrażam sobie, że można tego dokonać w zmiennej poziomu sesji. Jeszcze lepiej, użyj przycisku Zadaj pytanie w prawym górnym rogu.
Bryan Field
10
Nie wymaga znajomości nazw i typów kolumn, co było powodem, dla którego pytający chciał uniknąć tworzenia tabeli.
psparrow
30
możesz użyć tego w ten sposób, CREATE TEMPORARY TABLE IF NOT EXISTS table2 LIKE table1jeśli nie chcesz kopiować danych, po prostu
ułóż
1
co masz na myśli przez sesję?
Saurabh Chandra Patel
137

Oprócz odpowiedzi psparrow, jeśli chcesz dodać indeks do tabeli tymczasowej:

CREATE TEMPORARY TABLE IF NOT EXISTS 
  temp_table ( INDEX(col_2) ) 
ENGINE=MyISAM 
AS (
  SELECT col_1, coll_2, coll_3
  FROM mytable
)

Działa również z PRIMARY KEY

RafaSashi
źródło
3
Czy Engine = Memory może być również używany z taką składnią?
DarkSide
6
@DarkSide Tak ENGINE = MEMORY można również użyć. Zobacz następujący przykład: blog.cnizz.com/2010/11/24/…
RafaSashi
1
Jaka jest różnica między MyISAM a silnikiem Memory? jakie są zalety pamięci?
yeahman,
63

Użyj tej składni:

CREATE TEMPORARY TABLE t1 (select * from t2);
Rizon
źródło
1
To bardziej cel w przypadku kopiowania danych! Świetny!
Rafael Gomes Francisco
54

Silnik musi być przed wyborem:

CREATE TEMPORARY TABLE temp1 ENGINE=MEMORY 
as (select * from table1)
Krzyżowiec
źródło
39

ENGINE=MEMORYnie jest obsługiwane, gdy tabela zawiera BLOB/ TEXTkolumny

Cris
źródło
0
CREATE TEMPORARY TABLE IF NOT EXISTS to_table_name AS (SELECT * FROM from_table_name)
użytkownik11949964
źródło