Chiavi primarie e unicità
Comprenda le chiavi primarie, le differenze tra chiavi surrogate e naturali, le chiavi composte e perché ogni riga ha bisogno di un identificatore univoco affidabile
Chiavi primarie e unicità è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 2 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.
Perché ogni riga ha bisogno di un ID univoco
Per aggiornare o eliminare una riga specifica in sicurezza, è necessario poterla identificare senza ambiguità.
- Possono esistere due utenti chiamati "Alice Adams"
- Ma NON possono esistere due utenti con
id = 42 - L'identificatore univoco è chiamato chiave primaria
Dichiarare una chiave primaria
Una colonna viene contrassegnata come chiave primaria quando si crea la tabella:
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY,
sku VARCHAR(50) NOT NULL,
name VARCHAR(200) NOT NULL,
price NUMERIC(10,2) NOT NULL
);Chiave primaria = NOT NULL + UNIQUE
Una PRIMARY KEY applica automaticamente:
- NOT NULL: i valori della chiave primaria non possono mancare
- UNIQUE: nessuna riga può condividere lo stesso valore della chiave primaria con un'altra riga
Il database crea inoltre un indice univoco sulla chiave primaria, quindi le ricerche tramite id sono rapide.
Chiavi surrogate e naturali
Per la chiave primaria sono disponibili due possibilità:
- Surrogata: un ID sintetico generato dal database (BIGSERIAL, UUID). È la scelta più comune nelle applicazioni moderne.
- Naturale: un identificatore del mondo reale (email, ISBN). È rischiosa: le persone cambiano indirizzo email.
Buona pratica: utilizzate un ID surrogato e aggiungete un vincolo UNIQUE alla chiave naturale.
BIGSERIAL: interi con incremento automatico
In PostgreSQL, BIGSERIAL crea una colonna a incremento automatico a 64 bit supportata da una sequenza.
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL,
total NUMERIC(10,2) NOT NULL
);
-- You omit id on insert and the DB fills it in:
INSERT INTO orders (user_id, total) VALUES (7, 99.50);Chiavi primarie UUID
Un'alternativa è un UUID a 128 bit, utile quando gli ID devono essere univoci tra sistemi diversi o generati lato client.
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE sessions (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id BIGINT NOT NULL,
ip INET
);Chiavi primarie composte
A volte l'identificatore naturale è una combinazione di colonne:
CREATE TABLE order_items (
order_id BIGINT NOT NULL,
product_id BIGINT NOT NULL,
quantity INT NOT NULL,
PRIMARY KEY (order_id, product_id)
);
-- The pair (order_id, product_id) must be unique
-- A product can appear at most once per orderVincoli UNIQUE e chiave primaria
È possibile dichiarare univoche altre colonne senza renderle la chiave primaria:
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
username VARCHAR(50) UNIQUE
);
-- INSERT below fails on the second row:
INSERT INTO users (email, username) VALUES ('a@x.com', 'alice');
INSERT INTO users (email, username) VALUES ('a@x.com', 'bob'); -- ERRORCosa accade quando si inserisce un duplicato
Se si tenta di inserire una chiave primaria duplicata, il database rifiuta l'intera istruzione:
ERROR: duplicate key value violates unique constraint "users_pkey" DETAIL: Key (id)=(42) already exists.
È un comportamento utile: impedisce il danneggiamento silenzioso dei dati.
Cercare righe tramite la chiave primaria è rapido
L'indice univoco sulla chiave primaria consente ricerche O(log n), anche con miliardi di righe.
-- Index Scan using users_pkey on users (cost=0.43..8.45 rows=1)
SELECT email FROM users WHERE id = 42;Non riutilizzate gli ID
Anche quando eliminate una riga, NON riutilizzate la sua chiave primaria. Altre tabelle o sistemi esterni potrebbero farvi ancora riferimento. Lasciate che la sequenza continui ad aumentare: gli ID costano poco.
Riepilogo
Le chiavi primarie forniscono a ogni riga un riferimento stabile e univoco.
- Preferite chiavi surrogate (BIGSERIAL o UUID)
- Utilizzate UNIQUE per le chiavi naturali che non devono duplicarsi
- Le chiavi primarie composte rappresentano il requisito "questa coppia deve essere univoca"
Verifica rapida
Quale proprietà viene applicata implicitamente da una PRIMARY KEY?
Domande Frequenti
La lezione «Chiavi primarie e unicità» è gratuita?
Sì — il testo completo di «Chiavi primarie e unicità» è 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 «Chiavi primarie e unicità»?
Comprenda le chiavi primarie, le differenze tra chiavi surrogate e naturali, le chiavi composte e perché ogni riga ha bisogno di un identificatore univoco affidabile 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 2 di 4.
Quanto tempo richiede la lezione «Chiavi primarie e unicità»?
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
- Che cos’è un RDBMS e perché le tabelle sono importanti
- Chiavi primarie e unicità
- NULL: il terzo valore di verità
- Panoramica dei tipi di dati: INT VARCHAR DATE BOOLEAN