Crie uma tabela temporária em uma instrução SELECT sem uma CREATE TABLE separada

494

É possível criar uma tabela temporária (somente sessão) a partir de uma instrução select sem usar uma instrução create table e especificar cada tipo de coluna? Eu sei que tabelas derivadas são capazes disso, mas essas são super-temporárias (somente declaração) e quero reutilizá-las.

Isso economizaria tempo se eu não precisasse escrever um comando create table e manter a lista de colunas e a lista de tipos correspondentes.

Bryan Field
fonte

Respostas:

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

No manual encontrado em http://dev.mysql.com/doc/refman/5.7/en/create-table.html

Você pode usar a palavra-chave TEMPORARY ao criar uma tabela. Uma tabela TEMPORÁRIA é visível apenas para a sessão atual e é descartada automaticamente quando a sessão é fechada. Isso significa que duas sessões diferentes podem usar o mesmo nome de tabela temporária sem conflitar entre si ou com uma tabela não TEMPORÁRIA existente com o mesmo nome. (A tabela existente fica oculta até a tabela temporária ser descartada.) Para criar tabelas temporárias, você deve ter o privilégio CREATE TEMPORARY TABLES.

psparrow
fonte
8
Perfeito! Colunas com comprimentos máximos ideais e tudo! Eu adicionei a palavra temporaryassim create temporary table mytable as select ....
Bryan Field
5
@ imperium2335, talvez você deve tentar o seguinte: create table t as select ... limit 0; alter table t engine=memory; insert into t select .... Ou talvez você possa alterar o "mecanismo padrão de novas tabelas". Eu imagino que isso possa ser feito em uma variável no nível da sessão. Melhor ainda, use o botão Fazer pergunta no canto superior direito.
Bryan Campo
10
Não requer conhecimento sobre os nomes e tipos de colunas, que foi o motivo do questionador para evitar o uso de Criar tabela.
Psrrow
30
você pode usá-lo como este CREATE TEMPORARY TABLE IF NOT EXISTS table2 LIKE table1se você não quiser copiar dados, estrutura apenas
dzona
1
o que você quer dizer com sessão?
Saurabh Chandra Patel,
137

Além da resposta do psparrow, se você precisar adicionar um índice à sua tabela temporária, faça:

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

Também trabalha com PRIMARY KEY

RafaSashi
fonte
3
Engine = Memory também pode ser usado com essa sintaxe?
DarkSide
6
@DarkSide Sim ENGINE = MEMORY também pode ser usado. Veja o exemplo a seguir: blog.cnizz.com/2010/11/24/…
RafaSashi
1
qual é a diferença entre o MyISAM e o mecanismo de memória? quais são os benefícios da memória?
yeahman 21/11/19
63

Use esta sintaxe:

CREATE TEMPORARY TABLE t1 (select * from t2);
rizon
fonte
1
Isso é mais objetivo para copiar dados! Ótimo!
Rafael Gomes Francisco
54

O mecanismo deve estar antes de selecionar:

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

ENGINE=MEMORYnão é suportado quando a tabela contém BLOB/ TEXTcolunas

Cris
fonte
0
CREATE TEMPORARY TABLE IF NOT EXISTS to_table_name AS (SELECT * FROM from_table_name)
user11949964
fonte