Vai al contenuto
eLearner.app
Modulo 9 · Lezione 1 di 433/57 nel corso~10 min
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.

SQL
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
);
  • TEXT vs VARCHAR(n): In Postgres le performance sono identiche. Si usa VARCHAR(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 inserisci 10.555, Postgres lo arrotonda a 10.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.

SQL
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.

SQL
-- 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

Esercizio#sql.m9.l1.e1
Tentativi: 0Caricamento…

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.

Caricamento editor…
Mostra suggerimento

Scrivi CREATE TABLE user_reviews (...) e poi i vari field. Ricorda le virgole.

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#sql.m9.l1.e2
Tentativi: 0Caricamento…

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).

Caricamento editor…
Mostra suggerimento

Non scordare il ; per separare i due statement (il CREATE TYPE e il CREATE TABLE).

Soluzione disponibile dopo 3 tentativi