Contenido de esta guía
Respuesta rápida
Una tabla temporal es una tabla de trabajo cuya vida está limitada por el contexto del motor, normalmente la sesión o conexión. Sirve para guardar un resultado intermedio y reutilizarlo en varias sentencias sin crear una tabla permanente del modelo de negocio.
CREATE TEMP TABLE pedidos_grandes AS
SELECT id, cliente_id, total
FROM pedidos
WHERE total >= 200;TEMP y TEMPORARY están soportados por varios motores, pero el alcance exacto, el esquema temporal y el comportamiento al hacer COMMIT no son idénticos.
Modelo mental: una mesa de trabajo de la sesión
Una CTE organiza una sentencia. Una tabla permanente forma parte del modelo persistente. La tabla temporal queda en medio: materializa datos para reutilizarlos durante un trabajo corto y luego desaparece según las reglas del motor.
Pregunta útil: si el resultado solo se usa una vez, una CTE o subconsulta suele ser más simple. Si necesitas leer, transformar o indexar el mismo conjunto en varias sentencias, una tabla temporal puede ser más clara.
Ejemplo comprobado: reutilizar pedidos grandes
CREATE TEMP TABLE pedidos_grandes AS
SELECT id, cliente_id, total
FROM pedidos
WHERE total >= 200;
SELECT COUNT(*) AS pedidos,
ROUND(SUM(total), 2) AS importe
FROM pedidos_grandes;| pedidos | importe |
|---|---|
| 5 | 2788,90 |
La primera sentencia materializa cinco filas en la tabla temporal. La segunda trabaja sobre ese conjunto sin repetir el filtro original.
Qué cambia entre motores
| Motor | Forma | Vida típica |
|---|---|---|
| PostgreSQL | CREATE TEMP TABLE | Se elimina al terminar la sesión; ON COMMIT permite conservar filas, vaciarlas o eliminar la tabla al terminar la transacción. |
| MySQL | CREATE TEMPORARY TABLE | Visible solo en la sesión actual y eliminada automáticamente al cerrarla. |
| SQLite | CREATE TEMP TABLE | Se crea en la base temporal asociada a la conexión. |
Por estas diferencias, evita escribir una única regla universal sobre el momento exacto de borrado. Comprueba siempre el motor y, en PostgreSQL, si existe una cláusula ON COMMIT.
Tabla temporal vs CTE vs CTAS permanente
| Opción | Alcance | Úsala cuando |
|---|---|---|
| CTE | Una sentencia | Quieres organizar una consulta sin reutilizar el resultado en sentencias posteriores. |
| Tabla temporal | Sesión/conexión o transacción, según motor | Necesitas varias operaciones sobre el mismo conjunto intermedio. |
| CTAS permanente | Hasta que la tabla se elimine | El resultado debe persistir como objeto normal después de la sesión. |
Errores frecuentes
Usar una temporal para una sola lectura trivial
Crear, poblar y eliminar una tabla añade pasos. Si una CTE resuelve la intención de forma clara dentro de una sola sentencia, suele ser una opción más simple.
Suponer que todas duran hasta el mismo momento
PostgreSQL permite controlar el comportamiento en COMMIT; MySQL documenta alcance de sesión; SQLite coloca la tabla en su base temporal. El ciclo de vida es dependiente del motor.
Olvidar que materializas datos
Si cambian las tablas de origen, una tabla temporal ya poblada no se actualiza mágicamente. Debes volver a cargarla si necesitas reflejar datos nuevos.
Práctica guiada
Materializa clientes con pedidos
Crea una tabla temporal clientes_con_pedidos con los cliente_id distintos presentes en pedidos. Después cuenta cuántos clientes contiene.
Criterio de éxito: el conteo final es 10.
CREATE TEMP TABLE ... AS SELECT.DISTINCT.COUNT(*) sobre la temporal.Solución razonada
CREATE TEMP TABLE clientes_con_pedidos AS
SELECT DISTINCT cliente_id
FROM pedidos;
SELECT COUNT(*) AS clientes
FROM clientes_con_pedidos;| clientes |
|---|
| 10 |
La primera sentencia conserva un identificador por cliente y la segunda reutiliza ese conjunto ya materializado.
Qué debes recordar
- Una tabla temporal sirve para resultados intermedios reutilizables.
- Su ciclo de vida depende del motor.
- Una CTE suele ser más simple cuando todo cabe en una única sentencia.
CREATE TEMP TABLE ... AS SELECTcombina temporalidad y materialización.- Los datos materializados no se sincronizan automáticamente con las tablas de origen.