Le tabelle temporanee sono tabelle che esistono solo nella sessione o nella transazione corrente. Appena chiudi la tua sessione (o la transazione viene chiusa), la tabella temporanea e i suoi dati spariscono come impronte sulla sabbia. Sono perfette per salvare dati temporanei, fare calcoli intermedi o preparare dati per operazioni complesse.
Perché servono?
- Salvataggio temporaneo dei dati: Per esempio, hai dei calcoli complessi sui dati che devi fare in più step. Invece di stressare la tabella principale, puoi usare le tabelle temporanee.
- Analisi dei dati: Puoi raccogliere dati da più fonti, elaborarli e poi cancellare la tabella temporanea dopo l’analisi.
- Ottimizzazione di query complesse: A volte è meglio dividere una query in più step usando tabelle temporanee, così va più veloce.
- Minimizzare i rischi: Nessun rischio di rovinare le tabelle vere — le tabelle temporanee sono completamente isolate.
La magia delle tabelle temporanee è che i loro dati li vedi solo tu! Gli altri utenti del database non possono ficcare il naso, quindi sono sicure per fare esperimenti.
Creare tabelle temporanee
Creare una tabella temporanea è come creare una tabella normale, solo che aggiungi la parola chiave TEMP o TEMPORARY.
Sintassi:
CREATE TEMP TABLE table_name (
column_name data_type constraints,
...
);
Facile, vero? La tabella temporanea sparirà da sola quando chiudi la sessione.
Per esempio, creiamo una tabella temporanea per salvare dati sugli studenti:
CREATE TEMP TABLE temp_students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INTEGER CHECK (age > 0)
);
Ora abbiamo la tabella temporanea temp_students, dove puoi inserire dati e lavorarci come una tabella normale. Solo non dimenticare — sparisce appena chiudi la sessione.
Creare una tabella temporanea da una query
A volte non hai voglia di descrivere a mano la struttura della tabella temporanea — soprattutto se vuoi solo salvare il risultato di una query e lavorarci. In questo caso ti aiuta questa forma:
CREATE TEMP TABLE nome_tabella AS
SELECT ...;
Questa cosa non solo crea la tabella temporanea, ma la riempie subito con i dati della query.
Supponiamo che vuoi salvare gli studenti non iscritti a nessun corso:
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;
Adesso hai la tabella temp_unregistered_students che puoi usare in altre parti dello script — senza dover ripetere la query.
Perché farlo?
- Non devi specificare colonne e tipi — PostgreSQL li capisce dal risultato del
SELECT. - Puoi riusare i dati temporanei più volte senza ricalcolare tutto.
- È super utile per report, operazioni ETL e analytics.
Tabelle temporanee dentro le transazioni
Puoi creare tabelle temporanee dentro le transazioni. In questo caso vengono cancellate automaticamente quando la transazione finisce. È molto comodo quando vuoi essere sicuro che i dati temporanei non restino nel database. Ti racconterò di più sulle transazioni tra qualche livello — per ora goditi la vita senza pensieri :P
Esempio:
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, 'In attesa');
-- Vediamo i dati
SELECT * FROM temp_transactions;
COMMIT;
-- Ora la tabella temp_transactions è sparita!
Se invece di COMMIT fai ROLLBACK, anche i dati e la tabella vengono cancellati.
Usare le tabelle temporanee nei casi reali
Esempio 1: Unione temporanea di dati
Supponiamo di avere due tabelle: students e courses. Devi capire chi tra gli studenti non è ancora iscritto ai corsi. Possiamo prima raccogliere i dati in una tabella temporanea e poi analizzarli.
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;
-- Ora possiamo lavorare con la tabella temporanea temp_unregistered_students.
SELECT * FROM temp_unregistered_students;
Esempio 2: Preparare dati per un report
A volte devi raccogliere dati da più tabelle, trasformarli e preparare un report. Le tabelle temporanee sono perfette per questo.
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;
-- Abbiamo creato una tabella temporanea col risultato. Ora puoi fare un report su questa base:
SELECT name, total_quantity FROM temp_sales WHERE total_quantity > 50;
Trucchi e particolarità delle tabelle temporanee
Nominare le tabelle temporanee: se hai già una tabella normale chiamata students, puoi comunque creare una tabella temporanea con lo stesso nome! La tabella temporanea avrà la precedenza nella tua sessione. Però può confondere se ti dimentichi che stai lavorando con una tabella temporanea.
Ottimizzazione delle tabelle temporanee: PostgreSQL crea automaticamente indici per le colonne con PRIMARY KEY o UNIQUE anche nelle tabelle temporanee. Se vuoi velocizzare le cose, puoi aggiungere indici a mano:
CREATE INDEX idx_temp_students_age ON temp_students (age);
Cancellare una tabella temporanea: se vuoi cancellare una tabella temporanea prima che finisca la sessione, usa il comando DROP TABLE:
DROP TABLE temp_students;
Quantità di dati in una tabella temporanea: le tabelle temporanee stanno in RAM (se c’è abbastanza memoria), quindi sono molto più veloci. Però occhio: se i dati sono troppi, iniziano a usare il disco.
Errori comuni e come evitarli
Errore 1: "La tabella esiste già"
Se provi a creare una tabella temporanea con un nome già usato da un’altra tabella temporanea, avrai un errore. Usa CREATE TEMP TABLE IF NOT EXISTS oppure cancella la tabella prima di crearla:
DROP TABLE IF EXISTS temp_students;
CREATE TEMP TABLE temp_students (...);
Errore 2: "La tabella sparisce troppo presto"
Se crei una tabella temporanea dentro una transazione, ricordati che sparisce quando la transazione finisce. Pianifica le tue mosse in anticipo!
GO TO FULL VERSION