Creare una tabella temporanea in un'istruzione SELECT senza una CREATE TABLE separata


494

È possibile creare una tabella temporanea (solo sessione) da un'istruzione select senza utilizzare un'istruzione create table e specificare ogni tipo di colonna? So che le tabelle derivate sono in grado di farlo, ma quelle sono super temporanee (solo istruzioni) e voglio riutilizzarle.

Farebbe risparmiare tempo se non dovessi scrivere un comando di creazione tabella e mantenere abbinato l'elenco delle colonne e l'elenco dei tipi.

Risposte:


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

Dal manuale disponibile su http://dev.mysql.com/doc/refman/5.7/en/create-table.html

È possibile utilizzare la parola chiave TEMPORARY durante la creazione di una tabella. Una tabella TEMPORANEA è visibile solo per la sessione corrente e viene rilasciata automaticamente alla chiusura della sessione. Ciò significa che due diverse sessioni possono utilizzare lo stesso nome di tabella temporanea senza essere in conflitto tra loro o con una tabella esistente non temporanea con lo stesso nome. (La tabella esistente viene nascosta fino all'eliminazione della tabella temporanea.) Per creare tabelle temporanee, è necessario disporre del privilegio CREATE TAVOLI TEMPORANEI.


8
Perfetto! Colonne con lunghezze massime ottimali e tutto il resto! Ho aggiunto la parola temporarycosì create temporary table mytable as select ....
Bryan Field,

5
@ imperium2335, forse si dovrebbe provare il seguente: create table t as select ... limit 0; alter table t engine=memory; insert into t select .... Oppure, forse puoi cambiare il "motore predefinito di nuove tabelle". Immagino che ciò possa essere fatto in una variabile a livello di sessione. Meglio ancora, usa il pulsante Poni domanda in alto a destra.
Bryan Field,

10
Non richiede la conoscenza dei nomi e dei tipi di colonna, motivo per cui l'interrogante voleva evitare l'uso di Crea tabella.
psparrow

30
puoi usarlo in questo modo CREATE TEMPORARY TABLE IF NOT EXISTS table2 LIKE table1se non vuoi copiare dati, solo struttura
dzona

1
cosa intendi per sessione?
Saurabh Chandra Patel,

137

Oltre alla risposta di psparrow se hai bisogno di aggiungere un indice alla tua tabella temporanea fai:

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

Funziona anche con PRIMARY KEY


3
Engine = Memory può essere utilizzato anche con tale sintassi?
DarkSide,

6
@DarkSide Sì ENGINE = MEMORY può essere utilizzato anche. Vedi il seguente esempio: blog.cnizz.com/2010/11/24/…
RafaSashi il

1
qual è la differenza tra MyISAM e il motore di memoria? quali sono i vantaggi della memoria?
Sì,


54

Il motore deve essere prima di selezionare:

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

39

ENGINE=MEMORYnon è supportato quando la tabella contiene BLOB/ TEXTcolonne


0
CREATE TEMPORARY TABLE IF NOT EXISTS to_table_name AS (SELECT * FROM from_table_name)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.