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

Crea una relazione in SQL

In SQL si crea una relazione creando un vincolo di chiave esterna.

Più specificamente, hai una tabella padre e una tabella figlio. Il genitore contiene la chiave primaria e la tabella figlio contiene una chiave esterna che fa riferimento alla chiave primaria della tabella padre.

Quando usi SQL per creare una relazione, puoi creare la relazione nel momento in cui crei la tabella, oppure puoi crearla in un secondo momento (modificando la tabella). Questo articolo copre entrambi gli scenari.

Crea una relazione durante la creazione della tabella

Ecco un esempio di creazione di una relazione all'interno del tuo CREATE TABLE dichiarazione al momento della creazione della tabella.

CREATE TABLE Parent (
  ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
  ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  ChildName nvarchar(255) NOT NULL,
  ParentId int NOT NULL
  CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)     
    REFERENCES Parent (ParentId)
);

Qui ho creato due tabelle; uno chiamato Parent e l'altro chiamato Child .

Ho creato la relazione all'interno della definizione della tabella per il bambino. La relazione viene creata con il CONSTRAINT discussione. Nota che questo è ancora all'interno di CREATE TABLE dichiarazione.

La relazione ha bisogno di un nome. In questo caso l'ho chiamato FK_Child_Parent . La FOREIGN KEY parte è seguita dal nome della colonna (nella tabella figlio) che sarà la chiave esterna.

I REFERENCES parte specifica la colonna a cui farà riferimento la chiave esterna. In questo caso fa riferimento a ParentId colonna del Parent tavolo. Questo viene fatto usando REFERENCES Parent (ParentId) .

Questo è tutto ciò che serve per creare la relazione.

Si noti che gli esempi in questa pagina sono stati eseguiti utilizzando SQL Server. A seconda del tuo DBMS, potrebbe essere necessario modificare alcuni dettagli delle definizioni delle colonne.

Ad esempio IDENTITY è la versione di SQL Server di ciò che a volte viene chiamato AUTO_INCREMENT in altri DBMS (come MySQL). Se usi SQLite, ecco come creare una colonna a incremento automatico in SQLite.

Aggiungi una relazione a una tabella esistente

Puoi anche aggiungere una relazione a una tabella esistente, semplicemente usando il ALTER TABLE dichiarazione.

Facciamo finta di non aver creato la relazione durante la creazione delle due tabelle dell'esempio precedente. Quindi facciamo finta di averlo fatto invece:

CREATE TABLE Parent (
  ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
  ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  ChildName nvarchar(255) NOT NULL,
  ParentId int NOT NULL
);

Quindi, in questo scenario, tutto ciò che abbiamo fatto è stato creare due tabelle. Non è stata creata alcuna relazione tra loro.

Ora, dopo aver creato i tavoli, ci ricordiamo all'improvviso “oh accidenti, mi sono dimenticato di creare una relazione!”.

Nessun problema, ora possiamo farlo:

ALTER TABLE Child
  ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)     
    REFERENCES Parent (ParentId);

Fatto. Abbiamo appena aggiunto la relazione utilizzando gli stessi dettagli dell'esempio precedente.

Nota che SQLite non supporta l'aggiunta di chiavi esterne con ALTER TABLE dichiarazione. Scopri come aggiungere una chiave esterna a una tabella esistente in SQLite per ulteriori informazioni.

In aggiornamento/eliminazione

Per impostazione predefinita, le relazioni di SQL Server vengono create utilizzando ON DELETE NO ACTION e ON UPDATE NO ACTION . Pertanto, gli esempi precedenti sono stati creati utilizzando questa impostazione.

Tuttavia, DBMS diversi possono utilizzare altre impostazioni predefinite.

In ogni caso, puoi specificarlo esplicitamente nel tuo codice. Quindi possiamo modificare l'esempio precedente in modo che assomigli a questo:

ALTER TABLE Child
  ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)     
    REFERENCES Parent (ParentId)
    ON DELETE NO ACTION    
    ON UPDATE NO ACTION;

Ciò significa effettivamente che, se qualcuno tentasse di eliminare o aggiornare un record nella chiave primaria, si verificherebbe un errore e la modifica verrebbe annullata. Questo è il modo in cui SQL Server evita qualsiasi modifica che potrebbe compromettere l'integrità referenziale del tuo sistema.

Fondamentalmente, il motivo per cui crei una relazione in primo luogo è rafforzare l'integrità referenziale.

Tuttavia, hai alcune opzioni su come vuoi che SQL Server gestisca queste situazioni.

In particolare, puoi utilizzare uno qualsiasi dei seguenti valori:

  • NO ACTION :viene generato un errore e viene eseguito il rollback dell'azione di eliminazione/aggiornamento sulla riga nella tabella principale.
  • CASCADE :le righe corrispondenti vengono eliminate/aggiornate nella tabella di riferimento se tale riga viene eliminata/aggiornata nella tabella padre.
  • SET NULL :Tutti i valori che compongono la chiave esterna sono impostati su NULL se la riga corrispondente nella tabella padre viene eliminata o aggiornata. Ciò richiede che le colonne della chiave esterna siano annullabili.
  • SET DEFAULT :tutti i valori che compongono la chiave esterna vengono impostati sui valori predefiniti se la riga corrispondente nella tabella padre viene eliminata o aggiornata. Affinché questo vincolo venga eseguito, tutte le colonne della chiave esterna devono avere definizioni predefinite. Se una colonna è nullable e non è stato impostato alcun valore predefinito esplicito, NULL diventa il valore predefinito implicito della colonna.