0Pricing
SQL Academy · Lezione

FOREIGN KEY e azioni referenziali

Colleghi le tabelle con FOREIGN KEY e scelga ON DELETE CASCADE / SET NULL / RESTRICT in base al comportamento desiderato

FOREIGN KEY e azioni referenziali è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.

Cosa fa una chiave esterna

Una FOREIGN KEY fa sì che il database rifiuti le righe che fanno riferimento a righe padre inesistenti:

CREATE TABLE orders (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT NOT NULL REFERENCES users(id),
  total NUMERIC(10,2) NOT NULL
);

-- Inserting an order with user_id=999 fails if no such user exists.

Perché usare le chiavi esterne?

Le chiavi esterne impongono l'integrità referenziale:

  • Nessuna riga orfana
  • Gli errori dell'applicazione vengono rilevati al momento dell'inserimento
  • I diagrammi ER risultano accurati
  • Abilitano il comportamento automatico a cascata

Azioni referenziali

Che cosa deve succedere quando la riga padre viene eliminata o aggiornata? Sono disponibili cinque opzioni:

  • NO ACTION — errore (predefinita, differibile)
  • RESTRICT — errore (non differibile)
  • CASCADE — eliminare o aggiornare anche la riga figlia
  • SET NULL — impostare NULL nella chiave esterna della riga figlia
  • SET DEFAULT — impostare il valore predefinito nella chiave esterna della riga figlia

ON DELETE CASCADE

"Quando l'utente viene eliminato, eliminare anche i suoi ordini":

CREATE TABLE orders (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT NOT NULL
    REFERENCES users(id) ON DELETE CASCADE,
  total NUMERIC(10,2) NOT NULL
);

ON DELETE SET NULL

"Quando il manager viene rimosso, i dipendenti rimangono, ma perdono il proprio manager":

CREATE TABLE employees (
  id BIGSERIAL PRIMARY KEY,
  full_name TEXT NOT NULL,
  manager_id BIGINT REFERENCES employees(id) ON DELETE SET NULL
);

Predefinito: simile a RESTRICT

Senza un'azione referenziale, il tentativo di eliminare un padre che ha righe figlie non va a buon fine:

ERROR:  update or delete on table "users" violates foreign key constraint "orders_user_id_fkey" on table "orders"
DETAIL:  Key (id)=(42) is still referenced from table "orders".

Indicizzare sempre la colonna della chiave esterna

PostgreSQL NON crea automaticamente un indice sul lato figlio. Aggiungerne uno: senza indice, l'eliminazione di una riga padre avvia una scansione completa di ogni tabella figlia:

CREATE INDEX orders_user_id_idx ON orders(user_id);

Chiavi esterne composite

Fare riferimento a una chiave primaria composita:

CREATE TABLE order_items (
  order_id BIGINT,
  line_no INT,
  PRIMARY KEY (order_id, line_no)
);
CREATE TABLE shipments (
  order_id BIGINT,
  line_no INT,
  FOREIGN KEY (order_id, line_no)
    REFERENCES order_items(order_id, line_no)
);

Rimandare i controlli delle chiavi esterne

A volte è necessario inserire una coppia del tipo uovo e gallina. Contrassegnare la chiave esterna come DEFERRABLE INITIALLY DEFERRED:

ALTER TABLE orders
  ALTER CONSTRAINT orders_user_id_fkey DEFERRABLE INITIALLY DEFERRED;

BEGIN;
  INSERT INTO orders ... ;     -- FK temporarily not checked
  INSERT INTO users ... ;
COMMIT;                         -- checked here

Aggiungere chiavi esterne online

Nelle tabelle grandi, usare NOT VALID + VALIDATE per evitare un blocco prolungato:

ALTER TABLE orders
  ADD CONSTRAINT orders_user_id_fkey
  FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
ALTER TABLE orders VALIDATE CONSTRAINT orders_user_id_fkey;

Usare CASCADE con cautela

Le eliminazioni CASCADE si propagano. Eliminare un utente può cancellare ordini, pagamenti e log di audit. Assicurarsi che la cascata corrisponda alle esigenze aziendali.

Riepilogo

Le chiavi esterne sono barriere di sicurezza.

  • REFERENCES + azione dichiarano il collegamento e il comportamento
  • Indicizzare la colonna della chiave esterna nella tabella figlia
  • Usare NOT VALID + VALIDATE per aggiunte online

Verifica rapida

Qual è l'azione referenziale corretta per eliminare AUTOMATICAMENTE un ordine quando viene eliminato il relativo utente padre?

Domande Frequenti

La lezione «FOREIGN KEY e azioni referenziali» è gratuita?

Sì — il testo completo di «FOREIGN KEY e azioni referenziali» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.

Cosa imparerò in «FOREIGN KEY e azioni referenziali»?

Colleghi le tabelle con FOREIGN KEY e scelga ON DELETE CASCADE / SET NULL / RESTRICT in base al comportamento desiderato Eserciti SQL Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare SQL Academy?

Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «FOREIGN KEY e azioni referenziali»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione SQL Academy?

Sì. Ogni lezione SQL Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Vincoli NOT NULL e CHECK
  2. Vincoli UNIQUE e chiavi composte
  3. FOREIGN KEY e azioni referenziali
  4. Valori DEFAULT e colonne generate
← Torna a SQL Academy