Cree una tabla temporal en una instrucción SELECT sin una CREATE TABLE separada

494

¿Es posible crear una tabla temporal (solo sesión) a partir de una instrucción select sin usar una instrucción de creación de tabla y especificar cada tipo de columna? Sé que las tablas derivadas son capaces de esto, pero son súper temporales (solo enunciados) y quiero reutilizarlas.

Ahorraría tiempo si no tuviera que escribir un comando de crear tabla y mantener la lista de columnas y la lista de tipos coincidentes.

Bryan Field
fuente

Respuestas:

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

Del manual que se encuentra en http://dev.mysql.com/doc/refman/5.7/en/create-table.html

Puede usar la palabra clave TEMPORAL al crear una tabla. Una tabla TEMPORAL solo es visible para la sesión actual y se descarta automáticamente cuando se cierra la sesión. Esto significa que dos sesiones diferentes pueden usar el mismo nombre de tabla temporal sin entrar en conflicto entre sí o con una tabla no TEMPORAL existente del mismo nombre. (La tabla existente está oculta hasta que se descarta la tabla temporal). Para crear tablas temporales, debe tener el privilegio CREAR TABLAS TEMPORALES.

psparrow
fuente
8
¡Perfecto! ¡Columnas con longitudes máximas óptimas y todo! Agregué la palabra temporaryasí create temporary table mytable as select ....
Bryan Field
55
@ imperium2335, tal vez debería probar el siguiente: create table t as select ... limit 0; alter table t engine=memory; insert into t select .... O, tal vez pueda cambiar el "motor predeterminado de nuevas tablas". Me imagino que esto se puede hacer en una variable de nivel de sesión. Mejor aún, use el botón Hacer pregunta en la esquina superior derecha.
Bryan Field
10
No requiere conocer los nombres y tipos de columna, que fue la razón del interrogador para querer evitar el uso de Crear tabla.
psparrow
30
puedes usarlo así CREATE TEMPORARY TABLE IF NOT EXISTS table2 LIKE table1si no quieres copiar datos, solo estructura
dzona
1
¿Qué quieres decir con sesión?
Saurabh Chandra Patel el
137

Además de la respuesta de psparrow si necesita agregar un índice a su tabla temporal, haga lo siguiente:

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

También funciona con PRIMARY KEY

RafaSashi
fuente
3
¿Se puede usar Engine = Memory también con tal sintaxis?
DarkSide
66
@DarkSide Sí ENGINE = MEMORY también se puede usar. Vea el siguiente ejemplo: blog.cnizz.com/2010/11/24/…
RafaSashi
1
¿Cuál es la diferencia entre MyISAM y el motor de memoria? ¿Cuáles son los beneficios de la memoria?
Sí, el
63

Use esta sintaxis:

CREATE TEMPORARY TABLE t1 (select * from t2);
rizon
fuente
1
¡Eso es más objetivo para copiar datos! ¡Excelente!
Rafael Gomes Francisco
54

El motor debe estar antes de seleccionar:

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

ENGINE=MEMORYno es compatible cuando la tabla contiene BLOB/ TEXTcolumnas

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