Articles

SQL Server FOREIGN KEY (Italiano)

Sommario: In questo tutorial, imparerete come utilizzare il vincolo di chiave esterna di SQL Server per imporre un collegamento tra i dati in due tabelle.

Introduzione al vincolo di chiave esterna di SQL Server

Considerare le seguenti tabellevendor_groups evendors:

Ogni fornitore appartiene a un gruppo di fornitori e ogni gruppo di fornitori può avere zero o più fornitori. La relazione tra le tabellevendor_groups evendors è uno-a-molti.,

Per ogni riga nella tabella vendors, è sempre possibile trovare una riga corrispondente nella tabella vendor_groups.

Tuttavia, con l’impostazione corrente delle tabelle, è possibile inserire una riga nella tabellavendors senza una riga corrispondente nella tabellavendor_groups. Allo stesso modo, è anche possibile eliminare una riga nella tabella vendor_groups senza aggiornare o eliminare le righe corrispondenti nella tabella vendors che risulta in righe orfane nella tabella vendors.,

Per applicare il collegamento tra i dati nelle tabelle vendor_groups e vendors, è necessario stabilire una chiave esterna nella tabella vendors.

Una chiave esterna è una colonna o un gruppo di colonne in una tabella che identifica in modo univoco una riga di un’altra tabella (o la stessa tabella in caso di autoreferenziazione).

Per creare una chiave esterna, si utilizza il vincolo FOREIGN KEY.,

Le seguenti istruzioni rilasciano la tabella vendors e la ricreano con un vincolo FOREIGN KEY:

La tabella vendor_groups ora viene chiamata la tabella padre che è la tabella a cui fa riferimento il vincolo della chiave esterna. La tabellavendors è chiamata tabella figlio che è la tabella a cui viene applicato il vincolo della chiave esterna.,

la dichiarazione di cui sopra, la seguente clausola crea un FOREIGN KEY vincolo denominato fk_group questo link group_id nel vendors tabella group_id nel vendor_groups tabella:

di SQL Server vincolo di CHIAVE esterna sintassi

La sintassi generale per la creazione di un FOREIGN KEY vincolo è come indicato di seguito:

esaminare questa sintassi in dettaglio.,

Per prima cosa, specificare il nome del vincoloFOREIGN KEY dopo la parola chiaveCONSTRAINT. Il nome del vincolo è facoltativo quindi è possibile definire un vincoloFOREIGN KEY come segue:

In questo caso, SQL Server genererà automaticamente un nome per il vincoloFOREIGN KEY.

In secondo luogo, specificare un elenco di colonne di chiavi esterne separate da virgole racchiuse tra parentesi dopo la parola chiave FOREIGN KEY.,

In terzo luogo, specificare il nome della tabella padre a cui fa riferimento la chiave esterna e un elenco di colonne separate da virgole che ha un collegamento con la colonna nella tabella figlio.

Esempio di vincolo di CHIAVE ESTERNA SQL Server

In primo luogo, inserire alcune righe nella tabellavendor_groups:

In secondo luogo, inserire un nuovo fornitore con un gruppo di fornitori nella tabellavendors:

Code language: SQL (Structured Query Language) (sql)

la dichiarazione ha funzionato come previsto .,

Terzo, si tenta di inserire un nuovo fornitore, il cui produttore non esiste un gruppo nel vendor_groups tabella:

Code language: SQL (Structured Query Language) (sql)

SQL Server emesso il seguente errore:

In questo esempio, a causa del FOREIGN KEY vincolo, SQL Server ha rifiutato la inserisci e ha emesso un messaggio di errore.

Azioni referenziali

Il vincolo della chiave esterna garantisce l’integrità referenziale. Significa che è possibile inserire una riga nella tabella figlio solo se c’è una riga corrispondente nella tabella padre.,

Inoltre, il vincolo della chiave esterna consente di definire le azioni referenziali quando la riga nella tabella padre viene aggiornata o eliminata come segue:

IlON UPDATE eON DELETE specifica quale azione verrà eseguita quando una riga nella tabella padre viene aggiornata ed eliminata., I seguenti sono ammesse azioni : NO ACTION CASCADE SET NULL e SET DEFAULT

azioni di Eliminazione di righe nella tabella padre

Se si elimina una o più righe nella tabella padre, è possibile impostare una delle seguenti operazioni:

  • ON DELETE NO ACTION: SQL Server genera un errore e annulla l’azione di eliminare la riga nella tabella padre.
  • ON DELETE CASCADE: SQL Server elimina le righe della tabella figlio corrispondenti alla riga eliminata dalla tabella padre.,
  • ON DELETE SET NULL: SQL Server imposta le righe nella tabella figlio suNULL se le righe corrispondenti nella tabella padre vengono eliminate. Per eseguire questa azione, le colonne della chiave esterna devono essere annullabili.
  • ON DELETE SET DEFAULT SQL Server imposta le righe nella tabella figlio ai valori predefiniti se vengono eliminate le righe corrispondenti nella tabella padre. Per eseguire questa azione, le colonne delle chiavi esterne devono avere definizioni predefinite. Si noti che una colonna nullable ha un valore predefinito diNULL se non viene specificato alcun valore predefinito.,

Per impostazione predefinita, SQL Server applicaON DELETE NO ACTION se non si specifica esplicitamente alcuna azione.

azione di Aggiornamento delle righe della tabella padre

Se si aggiorna una o più righe nella tabella padre, è possibile impostare una delle seguenti operazioni:

  • ON UPDATE NO ACTION: SQL Server genera un errore e annulla l’azione di aggiornamento della riga nella tabella padre.
  • ON UPDATE CASCADE: SQL Server aggiorna le righe corrispondenti nella tabella figlio quando vengono aggiornate le righe nella tabella padre.,
  • ON UPDATE SET NULL: SQL Server imposta le righe nella tabella figlio suNULL quando viene aggiornata la riga corrispondente nella tabella padre. Si noti che le colonne della chiave esterna devono essere annullabili per l’esecuzione di questa azione.
  • ON UPDATE SET DEFAULT: SQL Server imposta i valori predefiniti per le righe della tabella figlio con le righe corrispondenti nella tabella padre aggiornate.