Tabelas temporárias são aquelas tabelas que só existem durante a sessão ou transação atual. Assim que tua sessão termina (ou a transação é fechada), a tabela temporária e os dados dela somem igual pegada na areia. Elas são perfeitas pra guardar dados temporários, fazer cálculos intermediários ou preparar dados pra operações mais cabulosas.
Pra que elas servem?
- Armazenamento temporário de dados: Por exemplo, tu tem uns cálculos complicados pra fazer em várias etapas. Ao invés de sobrecarregar a tabela principal, tu pode usar tabelas temporárias.
- Análise de dados: Tu pode juntar dados de várias fontes, processar eles e depois apagar a tabela temporária quando terminar a análise.
- Otimização de queries complexas: Às vezes é melhor dividir a query em várias etapas usando tabelas temporárias pra rodar mais rápido.
- Minimizar riscos: Não tem risco de ferrar as tabelas reais sem querer — as temporárias são totalmente isoladas.
A mágica das tabelas temporárias é que só tu enxerga os dados delas! Outros usuários do banco não conseguem ver, então é seguro pra fazer experimentos.
Criando tabelas temporárias
Criar uma tabela temporária é igual criar uma tabela normal, só que tu coloca a palavra-chave TEMP ou TEMPORARY.
Sintaxe:
CREATE TEMP TABLE table_name (
column_name data_type constraints,
...
);
Bem simples, né? A tabela temporária vai sumir sozinha quando tua sessão acabar.
Por exemplo, vamos criar uma tabela temporária pra guardar dados dos estudantes:
CREATE TEMP TABLE temp_students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INTEGER CHECK (age > 0)
);
Agora temos a tabela temporária temp_students, onde dá pra inserir dados e trabalhar igual uma tabela normal. Só não esquece — ela vai sumir assim que tu fechar a sessão.
Criando tabela temporária a partir de uma query
Às vezes tu não quer ficar descrevendo a estrutura da tabela temporária na mão — principalmente se tu só quer guardar o resultado de uma query e mexer nele. Nessa hora, tu pode usar:
CREATE TEMP TABLE nome_da_tabela AS
SELECT ...;
Esse jeito não só cria a tabela temporária, mas já preenche ela com os dados da query.
Imagina que tu quer guardar os estudantes que não estão inscritos em nenhum 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;
Agora tu tem a tabela temp_unregistered_students, que pode usar em outras partes do script — sem precisar repetir a query.
Por que isso é massa?
- Não precisa declarar colunas e tipos — o PostgreSQL descobre isso sozinho pelo resultado do
SELECT. - Dá pra usar os dados temporários várias vezes sem recalcular tudo.
- É super útil pra relatórios, ETL e análise de dados.
Tabelas temporárias dentro de transações
Tu pode criar tabelas temporárias dentro de transações. Nesse caso, elas vão ser apagadas automaticamente quando a transação acabar. Isso é ótimo quando tu quer garantir que os dados temporários não vão ficar largados no banco. Vou falar mais de transações daqui uns níveis — então por enquanto, só curte a vida sem preocupação :P
Exemplo:
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, 'Pendente');
-- Vamos ver os dados
SELECT * FROM temp_transactions;
COMMIT;
-- Agora a tabela temp_transactions sumiu!
Se ao invés de COMMIT tu rodar ROLLBACK, os dados e a tabela também vão ser apagados.
Usando tabelas temporárias em tarefas reais
Exemplo 1: Juntando dados temporariamente
Imagina que temos duas tabelas: students e courses. Precisamos descobrir quem ainda não está inscrito em nenhum curso. Podemos primeiro juntar os dados numa tabela temporária e só depois analisar.
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;
-- Agora podemos trabalhar com a tabela temporária temp_unregistered_students.
SELECT * FROM temp_unregistered_students;
Exemplo 2: Preparando dados pra relatório
Às vezes tu precisa juntar dados de várias tabelas, transformar eles e preparar um relatório. Tabelas temporárias são perfeitas pra isso.
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;
-- Criamos a tabela temporária com o resultado. Agora dá pra montar o relatório em cima dela:
SELECT name, total_quantity FROM temp_sales WHERE total_quantity > 50;
Manhas e detalhes das tabelas temporárias
Nomeando tabelas temporárias: se tu já tem uma tabela normal chamada students, ainda assim pode criar uma tabela temporária com o mesmo nome! A temporária vai ter prioridade na tua sessão. Mas cuidado pra não se confundir e esquecer que tá mexendo na temporária.
Otimização das tabelas temporárias: O PostgreSQL cria índices automaticamente pra colunas com PRIMARY KEY ou UNIQUE até nas temporárias. Se tu quiser deixar ainda mais rápido, pode criar índices na mão:
CREATE INDEX idx_temp_students_age ON temp_students (age);
Apagando tabela temporária: se tu quiser apagar a tabela temporária antes da sessão acabar, usa o comando DROP TABLE:
DROP TABLE temp_students;
Tamanho dos dados na tabela temporária: tabelas temporárias ficam na memória (se tiver recurso), então são bem rápidas. Mas se tu colocar dados demais, pode acabar indo pro disco.
Erros comuns e como evitar
Erro 1: "Tabela já existe"
Se tu tentar criar uma tabela temporária com um nome que já tá sendo usado por outra temporária, vai dar erro. Usa CREATE TEMP TABLE IF NOT EXISTS ou apaga a tabela antes de criar:
DROP TABLE IF EXISTS temp_students;
CREATE TEMP TABLE temp_students (...);
Erro 2: "Tabela some cedo demais"
Se tu criar uma tabela temporária dentro de uma transação, lembra que ela vai sumir quando a transação acabar. Planeja teus passos antes!
GO TO FULL VERSION