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.