Firebird Documentation Index → Guida sull'uso di NULL nel linguaggio SQL di Firebird → Chiavi ed indici univoci |
I NULL
non sono mai permessi nelle chiavi
primarie. Una colonna che sia (parte di) una chiave primaria
(primary key o PK) deve essere definita come
NOT NULL o nella colonna stessa o nella definizione
del dominio. Notare che un vincolo «CHECK (XXX IS NOT
NULL)» non funziona: è proprio necessaria la specifica
NOT NULL subito dopo il tipo di dato.
Firebird 1.5 ha un problema che permette la definizione di
chiavi primarie su colonne NOT NULL che possono
contenere valori NULL
. Come questo possa
succedere, e ci possano essere NULL
in colonne
del genere lo spieghiamo più avanti.
In Firebird 1.0, le chiavi univoche sono
soggette alle stesse restrizioni delle chiavi primarie: la colonna o
le colonne che ne fanno parte devono essere definite come
NOT NULL. Per gli indici
univoci, questo non è necessario. Tuttavia, quando viene creato un
indice univoco, la tabella non deve contenere nè
NULL
o valori duplicati nei campi coinvolti,
altrimenti la creazione dell'indice fallisce. Una volta creato,
risulta impossibile inserire NULL
o valori
duplicati.
Da Firebird 1.5, lke chiavi univoche e gli indici univoci non
solo permettono i NULL
, ma perfino permettono
NULL
molteplici. Con una chiave o un indice di
una sola colonna, si possono iserire quanti NULL
si vuole in quella colonna, ovviamente ogni valore non
NULL
si può inserirer solo una volta.
Se la chiave o l'indice risulta definita su più di una colonna in Firebird 1.5 e successivi:
Si possono inserire più righe dove tutte le colonne della
chiave o indice sono NULL
;
Non appena uno o più colonne della chiave non sono
NULL
, ogni combinazioni di valori diversi da
NULL
deve essere univoca nella tabella.
Ovviamente va compreso che (1, NULL
) non è la
stessa cosa di (NULL
, 1).
Le chiavi esterne in quanto tali non impongono restrizioni ai
NULL
. Le colonne delle chiavi esterne devono sempre
riferirsi a colonne (o insiemi di colonne) che sono chiavi primarie o
univoche. Un indice univoco con la colonna o le colonne riferite non è
sufficiente.
Nelle versioni fino alla 2.0 inclusa, cercando di creare una chiave esterna su una destinazione che non è chiave primaria nè una chiave univoca, Firebird lamenta il fatto che non ci riesce a trovare nessun indice univoco anche se un tale indice esiste. In Firebird 2.1, il messaggio correttamente informa che non vi esiste nessuna chiave univoca o primaria.
Ad ogni modo, anche se i NULL
sono
assolutamente proibiti nella chiave di destinazione (per esempio quando
sono verso chiavi primarie), una qualsiasi colonna appartenente ad una
chiave esterna può acora contenere NULL
, a meno che
non sia impedito da vincoli addizionali.
Firebird Documentation Index → Guida sull'uso di NULL nel linguaggio SQL di Firebird → Chiavi ed indici univoci |