Introduzione alla chiave esterna in SQL

Chiave esterna è un vincolo in SQL. È usato per mettere in relazione le due tabelle. Una chiave esterna in una tabella punta a una chiave primaria in un'altra tabella. È possibile utilizzare una chiave esterna per assicurarsi che la riga in una tabella abbia le righe / righe corrispondenti in un'altra tabella. La tabella referenziata si chiama tabella parent e la tabella con chiave esterna è nota come tabella child. Questa relazione genitore-figlio applica la regola nota come integrità referenziale. L'integrità referenziale è una proprietà dei dati che afferma che tutti i suoi riferimenti sono validi.

Pertanto, se nel database sono presenti relazioni da 1 a molte o da molte a molte, le chiavi esterne saranno molto utili. Funziona come riferimento incrociato tra due tabelle (parent_table e child_table) perché fa riferimento alla chiave primaria di un'altra tabella. Quindi stabilisce un collegamento tra parent_table e child_table.

Sintassi

La creazione di una nuova tabella con una chiave esterna richiede l'autorizzazione CREATE TABLE nel database

CREATE TABLE child_Table
(
column_1 datatype ( NULL |NOT NULL ),
column_2 datatype ( NULL |NOT NULL ),

CONSTRAINT F_key
FOREIGN KEY (child_column1, child_column2, … child_column_n)
REFERENCES parent_Table (parent_column1, parent_column2, … parent_column_n)
( ON DELETE ( NO ACTION |CASCADE |SET NULL |SET DEFAULT ) ) ( ON UPDATE ( NO ACTION |CASCADE |SET NULL |SET DEFAULT ) ) );

  • Child_Table è il nome della tabella che creeremo
  • colonna_1, colonna_2- le colonne da aggiungere alla tabella.
  • F_key- Questo è un vincolo di chiave esterna.
  • child_column1, child_column2… child_column_n- È il nome delle colonne child_Table che fanno riferimento alla chiave primaria nella tabella padre.
  • Parent_Table- Questo è il nome di parent_table. La chiave primaria di parent_table è indicata in child_table
  • ON DELETE: questo parametro agisce sui dati figlio dopo l'eliminazione dei dati padre. SET NULL, NO ACTION, CASCADE, SET DEFAULT sono alcuni dei valori di questo parametro.
  • IN AGGIORNAMENTO: si tratta di un parametro facoltativo che agisce sui dati figlio dopo l'aggiornamento sui dati padre. SET NULL, NO ACTION, CASCADE, SET DEFAULT sono alcuni dei valori di questo parametro.
  • CASCADE: possiamo usarlo insieme a ON DELETE e ON UPDATE. Dopo l'eliminazione o l'aggiornamento dei dati padre I dati figlio verranno eliminati o aggiornati.

La creazione di una chiave esterna in una tabella esistente richiede l'autorizzazione ALTER sulla tabella.

ALTER table_name
ADD CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name(columns)
REFERENCES parent_table(columns)

Regole

  1. Le chiavi esterne non sono applicabili alle tabelle temporanee.
  2. Il vincolo di chiave esterna non deve essere collegato solo alla chiave primaria di un'altra tabella, ma può anche essere collegato al vincolo UNIQUE di un'altra tabella.
  3. I vincoli FOREIGN KEY possono fare riferimento a un'altra colonna nella stessa tabella. Questo è indicato come autoreferenzialità.
  4. I vincoli di chiave esterna possono fare riferimento alle tabelle all'interno dello stesso database.
  5. Possiamo anche inserire valori NULL nella tabella figlio.
  6. Quando inseriamo un valore diverso da NULL nel vincolo della chiave esterna, il valore deve esistere nella colonna di riferimento, altrimenti si è verificato un messaggio di violazione.
  7. Il valore delle chiavi univoche del genitore non può essere modificato se la regola di aggiornamento è RESTRICT e sono presenti una o più righe dipendenti. Tuttavia, se la regola di aggiornamento è NESSUNA AZIONE, le chiavi univoche principali possono essere aggiornate purché ogni figlio abbia una chiave principale al completamento dell'istruzione di aggiornamento.

Esempi

Supponiamo di avere due tabelle Clienti e Ordini. La tabella Clienti contiene tutti i dati relativi ai clienti e la tabella Ordini con dati relativi agli ordini dei clienti.

I clienti

cust_idChiave primaria
cust_name
Posizione

Ordini

ID ordineChiave primaria
Data dell'ordine
Quantità
cust_idChiave esterna
Importo totale

Nell'esempio sopra, la colonna Cust_id nella tabella ORDERS è una chiave esterna che punta alla colonna Cust_id nella tabella CUSTOMERS.

Supponiamo che queste tabelle abbiano i seguenti valori

I clienti

1001alexNOI
1002CareyNOI
1003SidUK
1004TomAUS
1005KapilIND

Ordini

7820-10-2018510021200
792017/12/1041001800
8020-11-201621005369
812016/09/1051002258
8219-08-20161110041900
8330-06-20164510012300
8416-02-201671001890
852016/02/0121002260

Per cust_id 1001 esistono tre ordini nella tabella degli ordini.

Per cust_id 1003 non c'è ordine.

Quindi, se abbiamo dati particolari (Say id 1003) nella tabella padre, non è necessario disporre di tali dati nella tabella figlio, ma viceversa non è vero.

Non possiamo avere dati nella tabella figlio (tabella ordini) che non esiste nella tabella padre (clienti).

Ad esempio, non è possibile inserire un nuovo record, ad esempio, per cust_id 1006 nella tabella Ordini perché cust_id 1006 non esiste nella tabella Clienti.

Di seguito sono riportati gli esempi che violano l'integrità referenziale di questa relazione:

  1. Inserimento di una riga nella tabella ORDINI in cui Cust_ID non viene visualizzato nella colonna Cust_ID nella tabella CUSTOMERS.
  2. L'eliminazione di una riga dalla tabella CUSTOMERS in cui il Cust_ID della riga da eliminare è ancora presente nella colonna Cust_ID nella tabella ORDERS.

Quando un determinato record viene eliminato dalla tabella principale, esistono due modi per mantenere l'integrità dei dati nella tabella figlio. Quando due tabelle sono collegate con chiave esterna e alcuni dati nella tabella principale vengono eliminati, per i quali esiste anche il record nella tabella figlio, allora abbiamo un meccanismo per salvare l'integrità dei dati nella tabella figlio

  • Su Elimina cascata : questo rimuoverà il record dalla tabella figlio se quel valore della chiave esterna viene eliminato dalla tabella principale.
  • Su Elimina NULL: questo imposterà tutti i valori in quel record della tabella figlio come NULL, per i quali il valore della chiave esterna viene eliminato dalla tabella principale.

Conclusione - Chiave esterna in SQL

Quindi è consigliabile utilizzare la chiave esterna nel database che ha relazioni uno a uno o uno a molte. Il vantaggio principale dell'utilizzo dei vincoli di chiave esterna è che migliora le prestazioni. Gli sviluppatori possono facilmente identificare la struttura del database. Possiamo anche esaminare come la query recupererà i dati.

Articoli consigliati

Questa è una guida alla chiave esterna in SQL. Qui discutiamo le regole e gli esempi di chiave esterna in SQL con la sintassi. Puoi anche dare un'occhiata ai seguenti articoli per saperne di più -

  1. Visualizzazioni SQL
  2. Tipi di join in SQL Server
  3. Che cos'è PL / SQL?
  4. Vincoli di SQL Server
  5. I 6 migliori tipi di join in MySQL con esempi