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.

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.


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


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,


54

Silnik musi być przed wyborem:

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

39

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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.