Lezioni del modulo (1/4)
Tipi di dato avanzati ed ENUM
Nella lezione precedente abbiamo visto il comando base CREATE TABLE. Esploriamo ora alcuni tipi di dato avanzati che PostgreSQL ci offre per modellare i nostri domini in modo più preciso e sicuro.
Tipi numerici e di testo
PostgreSQL ha vari tipi per i numeri e il testo. Scegliere quello giusto aiuta sia per la validazione che per lo spazio occupato.
CREATE TABLE advanced_products (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
description TEXT,
-- NUMERIC(p,s) dove p = cifre totali, s = cifre decimali
price NUMERIC(10, 2) NOT NULL,
featured BOOLEAN DEFAULT FALSE
);TEXTvsVARCHAR(n): In Postgres le performance sono identiche. Si usaVARCHAR(n)solo quando vuoi limitare esplicitamente a livello di database la lunghezza inserita.NUMERIC(10, 2): Perfetto per denaro o precisione aritmetica. Qui ammette al massimo 8 cifre intere e 2 decimali (10 in totale). Se inserisci10.555, Postgres lo arrotonda a10.56.
Il tipo UUID
Per gli identificatori sicuri ed esposti sul web (come ID pubblici nelle URL) si preferisce spesso UUID rispetto al classico incremento SERIAL.
CREATE TABLE public_orders (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
customer TEXT NOT NULL,
total NUMERIC(10, 2)
);ENUM (Enumerazioni)
Spesso una colonna deve contenere solo uno tra pochi valori predefiniti (es. stato di un ordine: "nuovo", "pagato", "spedito"). Un approccio è usare la parola chiave CHECK, ma PostgreSQL offre i tipi personalizzati ENUM.
-- Dobbiamo prima creare il tipo:
CREATE TYPE order_status AS ENUM ('nuovo', 'pagato', 'spedito', 'cancellato');
-- Ora possiamo usarlo in una tabella:
CREATE TABLE orders_demo (
id SERIAL PRIMARY KEY,
status order_status NOT NULL DEFAULT 'nuovo'
);Questo garantisce che nessuno possa mai inserire uno stato non valido, proteggendo la consistenza dei dati.
Prova tu
Crea una tabella 'user_reviews' con: id (SERIAL pk), test_id (UUID con default gen_random_uuid()), score (intero not null), e un content (TEXT). Nessuno degli altri campi necessita vincoli espliciti se non il tipo.
Mostra suggerimento
Scrivi CREATE TABLE user_reviews (...) e poi i vari field. Ricorda le virgole.
Soluzione disponibile dopo 3 tentativi
Esercizio di ripasso
Crea prima il tipo ENUM 'user_role' con valori 'admin' e 'user'. Poi crea la tabella 'enum_users' con id (SERIAL pk) e role (il tipo appena creato, NOT NULL).
Mostra suggerimento
Non scordare il ; per separare i due statement (il CREATE TYPE e il CREATE TABLE).
Soluzione disponibile dopo 3 tentativi