Problema:
Vuoi creare una chiave esterna per una tabella in un database.
Esempio:
Vorremmo creare una tabella denominata student
che contiene una chiave esterna che fa riferimento all'id
colonna nella tabella city
.
Soluzione 1 (nuova tabella):
CREATE TABLE student ( id INT PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, city_id INT FOREIGN KEY REFERENCES city(id) );
Discussione:
Per creare una nuova tabella contenente una colonna di chiave esterna che fa riferimento a un'altra tabella, utilizzare la parola chiave FOREIGN KEY REFERENCES
alla fine della definizione di tale colonna. Seguilo con il nome della tabella di riferimento e il nome della colonna di riferimento tra parentesi.
Nel nostro esempio creiamo la tabella student
utilizzando un CREATE TABLE
clausola. Elenchiamo i nomi delle colonne e mettiamo tra parentesi i rispettivi tipi di dati. La colonna city_id
è la chiave esterna in questa tabella e indica il valore dell'ID memorizzato nella colonna id
nella tabella city
. Scriviamo FOREIGN KEY REFERENCES
alla fine della definizione di questa colonna e seguirla con la tabella e la colonna di riferimento:city(id)
.
Tieni presente che puoi creare più di una chiave esterna per una tabella.
Soluzione 2 (nuova tabella):
CREATE TABLE student ( id INT PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, city_id INT, FOREIGN KEY (city_id) REFERENCES city(id) );
Discussione:
Un altro modo per definire una chiave esterna durante la creazione della tabella consiste nell'utilizzare FOREIGN KEY REFERENCES
clausola alla fine delle definizioni di colonna. In questo caso, dopo la FOREIGN KEY
clausola, designiamo la colonna della chiave esterna. Poi arriva il REFERENCES
clausola insieme al nome della tabella e della colonna a cui si fa riferimento.
Puoi creare chiavi esterne su più di una colonna, come mostrato di seguito:
Soluzione 3 (nuova tabella):
CREATE TABLE student ( id INT PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, score_id INT, subject_id INT, CONSTRAINT fk_student_score_subject_id FOREIGN KEY (subject_id, score_id) REFERENCES score_subject(subject_id, score_id) );
In questo esempio, il vincolo fk_student_score_subject_id
è una chiave esterna composta da due colonne:score_id
e subject_id
. Queste due colonne di chiave esterna fanno riferimento a due colonne nella tabella score_subject
– score_id
e subject_id
.
Ecco un altro esempio:
Soluzione 4 (nuova tabella):
CREATE TABLE student ( id INT PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, city_id INT, CONSTRAINT fk_student_city_id FOREIGN KEY (city_id) REFERENCES city(id) );
Discussione:
In questo codice abbiamo di nuovo il CONSTRAINT
clausola con il nome di questo vincolo. Usa nomi di facile lettura e comprensione. Nel nostro esempio, utilizziamo il nome fk_student_city_id
, che indica la tabella e la colonna pertinenti. Successivamente, scriviamo FOREIGN KEY
e aggiungi (tra parentesi) il nome della colonna che diventa la chiave esterna. Poi abbiamo i REFERENCES
clausola seguita dal nome della tabella e della colonna di riferimento (qui:id
).
Soluzione 5 (tabella esistente):
ALTER TABLE student ADD FOREIGN KEY (city_id) REFERENCES city(id);
Discussione:
È anche possibile aggiungere una nuova chiave esterna a una tabella esistente. Qui, la tabella viene modificata utilizzando un ALTER TABLE
clausola. Il nome del tavolo (nel nostro esempio, student
) viene posizionato dopo il ALTER TABLE
parola chiave. Successivamente, il ADD FOREIGN KEY
La clausola è seguita dal nome della colonna che verrà utilizzata come chiave esterna. Poi abbiamo la REFERENCES clause
con il nome della tabella di riferimento e il nome della colonna della chiave primaria tra parentesi.
Nota che la tabella che stai modificando deve esistere prima che questo comando venga eseguito.
Soluzione 6 (tabella esistente, vincolo di chiave esterna):
ALTER TABLE student ADD CONSTRAINT fk_student_city_id FOREIGN KEY (city_id) REFERENCES city(id)
Discussione:
Utilizzare una query come questa se si desidera nominare una colonna di chiave esterna come vincolo per una tabella esistente. Qui, il vincolo di chiave esterna è denominato fk_student_city_id
. Se non specifichi il nome del vincolo, il database genera un nome del vincolo predefinito (che varia in base al database).