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.

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.


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


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


54

O mecanismo deve estar antes de selecionar:

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

39

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


0
CREATE TEMPORARY TABLE IF NOT EXISTS to_table_name AS (SELECT * FROM from_table_name)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.