Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Una chiave esterna può essere NULL e/o duplicata?

Risposta breve:Sì, può essere NULL o duplicato.

Voglio spiegare perché una chiave esterna potrebbe dover essere nulla o potrebbe dover essere univoca o non unica. Innanzitutto ricorda che una chiave esterna richiede semplicemente che il valore in quel campo debba esistere prima in una tabella diversa (la tabella padre). Questo è tutto ciò che un FK è per definizione. Null per definizione non è un valore. Null significa che non sappiamo ancora quale sia il valore.

Lascia che ti faccia un esempio di vita reale. Si supponga di disporre di un database in cui sono archiviate le proposte di vendita. Si supponga inoltre che ogni proposta abbia un solo addetto alle vendite assegnato e un cliente. Quindi la tua tabella delle proposte avrebbe due chiavi esterne, una con l'ID cliente e una con l'ID rappresentante di vendita. Tuttavia, al momento della creazione del record, un rappresentante di vendita non è sempre assegnato (perché nessuno è ancora libero di lavorarci sopra), quindi l'ID cliente viene compilato ma l'ID rappresentante di vendita potrebbe essere nullo. In altre parole, di solito è necessaria la possibilità di avere un FK nullo quando potresti non conoscerne il valore al momento dell'inserimento dei dati, ma conosci altri valori nella tabella che devono essere inseriti. Per consentire i null in un FK generalmente tutto ciò che devi fare è consentire i null sul campo che ha l'FK. Il valore null è separato dall'idea che sia un FK.

Il fatto che sia univoco o meno dipende dal fatto che la tabella abbia una relazione uno-uno o uno-molti con la tabella padre. Ora, se hai una relazione uno-uno, è possibile che tu possa avere i dati tutti in una tabella, ma se la tabella sta diventando troppo ampia o se i dati sono su un argomento diverso (l'esempio del dipendente - assicurazione fornito da @tbone per esempio), quindi vuoi tabelle separate con un FK. Vorresti quindi rendere questo FK anche il PK (che garantisce l'unicità) o porre un vincolo univoco su di esso.

La maggior parte degli FK sono per una relazione uno a molti ed è quello che ottieni da un FK senza aggiungere un ulteriore vincolo sul campo. Quindi hai una tabella degli ordini e la tabella dei dettagli dell'ordine, ad esempio. Se il cliente ordina dieci articoli contemporaneamente, dispone di un ordine e di dieci record di dettagli dell'ordine che contengono lo stesso orderID dell'FK.