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.

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.


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


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


54

El motor debe estar antes de seleccionar:

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

39

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


0
CREATE TEMPORARY TABLE IF NOT EXISTS to_table_name AS (SELECT * FROM from_table_name)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.