Trabajando con tablas temporales en PostgreSQL
Las tablas temporales son tablas que existen solo durante la sesión o transacción actual. En cuanto termines tu sesión (o cierres la transacción), la tabla temporal y sus datos desaparecerán como huellas en la arena. Son perfectas para guardar datos temporalmente, hacer cálculos intermedios o preparar datos para operaciones más complejas.
¿Para qué sirven?
- Almacenamiento temporal de datos: Por ejemplo, tienes cálculos complicados sobre los datos que necesitas hacer en varias etapas. En vez de cargar la tabla principal, puedes usar tablas temporales.
- Análisis de datos: Puedes juntar datos de varias fuentes, procesarlos y luego borrar la tabla temporal después del análisis.
- Optimización de consultas complejas: A veces es mejor dividir la consulta en varias etapas usando tablas temporales para que todo vaya más rápido.
- Minimizar riesgos: No hay riesgo de romper las tablas reales por accidente — las tablas temporales están totalmente aisladas.
La magia de las tablas temporales es que ¡solo tú puedes ver sus datos! Otros usuarios de la base de datos no podrán verlas, así que son seguras para hacer experimentos.
Creando tablas temporales
Crear una tabla temporal es casi igual que crear una tabla normal, solo que añades la palabra clave TEMP o TEMPORARY.
Sintaxis:
CREATE TEMP TABLE table_name (
column_name data_type constraints,
...
);
Fácil, ¿verdad? La tabla temporal desaparecerá automáticamente cuando termines tu sesión.
Por ejemplo, vamos a crear una tabla temporal para guardar datos de estudiantes:
CREATE TEMP TABLE temp_students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INTEGER CHECK (age > 0)
);
Ahora tenemos la tabla temporal temp_students, donde puedes insertar datos y trabajar con ellos como si fuera una tabla normal. Solo recuerda — desaparecerá cuando cierres la sesión.
Crear una tabla temporal desde una consulta
A veces no quieres escribir la estructura de la tabla temporal a mano — sobre todo si solo quieres guardar el resultado de una consulta y trabajar con él. En ese caso, puedes usar esta forma:
CREATE TEMP TABLE nombre_tabla AS
SELECT ...;
Esta construcción no solo crea la tabla temporal, sino que la llena de datos directamente desde la consulta.
Supón que quieres guardar los estudiantes que no están inscritos en ningún curso:
CREATE TEMP TABLE temp_unregistered_students AS
SELECT s.id, s.name
FROM students s
LEFT JOIN enrollments e ON s.id = e.student_id
WHERE e.student_id IS NULL;
Ahora tienes la tabla temp_unregistered_students, que puedes usar en otras partes del script — sin tener que repetir la consulta.
¿Por qué hacer esto?
- No tienes que especificar columnas y tipos — PostgreSQL los detecta del resultado del
SELECT. - Puedes usar los datos temporales varias veces sin recalcular todo.
- Esto es súper útil en informes, operaciones ETL y análisis.
Tablas temporales dentro de transacciones
Puedes crear tablas temporales dentro de transacciones. En ese caso, se borrarán automáticamente cuando termine la transacción. Esto es muy útil cuando quieres asegurarte de que los datos temporales no se queden en la base. Ya hablaré más de transacciones en otro nivel — así que por ahora, disfruta la vida sin preocupaciones :P
Ejemplo:
BEGIN;
CREATE TEMP TABLE temp_transactions (
transaction_id SERIAL PRIMARY KEY,
amount NUMERIC(10, 2) NOT NULL,
status VARCHAR(50)
);
INSERT INTO temp_transactions (amount, status)
VALUES (100.50, 'Pendiente');
-- Vamos a ver los datos
SELECT * FROM temp_transactions;
COMMIT;
-- ¡Ahora la tabla temp_transactions ha desaparecido!
Si en vez de COMMIT usas ROLLBACK, los datos y la tabla también se borrarán.
Usando tablas temporales en tareas reales
Ejemplo 1: Unión temporal de datos
Supón que tienes dos tablas: students y courses. Hay que ver quiénes de los estudiantes aún no están inscritos en cursos. Podemos primero juntar los datos en una tabla temporal y luego analizarlos.
CREATE TEMP TABLE temp_unregistered_students AS
SELECT s.id, s.name
FROM students s
LEFT JOIN enrollments e ON s.id = e.student_id
WHERE e.student_id IS NULL;
-- Ahora podemos trabajar con la tabla temporal temp_unregistered_students.
SELECT * FROM temp_unregistered_students;
Ejemplo 2: Preparar datos para un informe
A veces necesitas juntar datos de varias tablas, transformarlos y preparar un informe. Las tablas temporales son perfectas para esto.
CREATE TEMP TABLE temp_sales AS
SELECT p.product_id, p.name, SUM(s.quantity) AS total_quantity
FROM products p
JOIN sales s ON p.product_id = s.product_id
GROUP BY p.product_id, p.name;
-- Creamos una tabla temporal con el resultado. Ahora podemos hacer un informe con ella:
SELECT name, total_quantity FROM temp_sales WHERE total_quantity > 50;
Trucos y detalles de las tablas temporales
Nombrar tablas temporales: si ya tienes una tabla normal llamada students, igual puedes crear una tabla temporal con el mismo nombre. La tabla temporal tendrá prioridad en tu sesión. Pero ojo, puede ser confuso si olvidas que estás usando una tabla temporal.
Optimización de tablas temporales: PostgreSQL crea automáticamente índices para columnas con PRIMARY KEY o UNIQUE incluso en tablas temporales. Si necesitas que todo vaya más rápido, puedes añadir índices manualmente:
CREATE INDEX idx_temp_students_age ON temp_students (age);
Borrar una tabla temporal: si quieres borrar una tabla temporal antes de terminar la sesión, usa el comando DROP TABLE:
DROP TABLE temp_students;
Tamaño de los datos en la tabla temporal: las tablas temporales se guardan en memoria (si hay recursos), así que son mucho más rápidas. Pero ojo, si metes demasiados datos, puede que empiece a usar disco.
Errores comunes y cómo evitarlos
Error 1: "La tabla ya existe"
Si intentas crear una tabla temporal con un nombre que ya está ocupado por otra tabla temporal, te dará error. Usa CREATE TEMP TABLE IF NOT EXISTS o borra la tabla antes de crearla:
DROP TABLE IF EXISTS temp_students;
CREATE TEMP TABLE temp_students (...);
Error 2: "La tabla desaparece demasiado pronto"
Si creas una tabla temporal dentro de una transacción, recuerda que desaparecerá cuando termine la transacción. ¡Planea tus pasos con antelación!
GO TO FULL VERSION