Probleem:
U wilt een externe sleutel maken voor een tabel in een database.
Voorbeeld:
We willen graag een tabel maken met de naam student
die een externe sleutel bevat die verwijst naar de id
kolom in de tabel city
.
Oplossing 1 (nieuwe tabel):
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) );
Discussie:
Om een nieuwe tabel te maken met een refererende-sleutelkolom die verwijst naar een andere tabel, gebruikt u het trefwoord FOREIGN KEY REFERENCES
aan het einde van de definitie van die kolom. Volg dat met de naam van de tabel waarnaar wordt verwezen en de naam van de kolom waarnaar wordt verwezen tussen haakjes.
In ons voorbeeld maken we de tabel student
met behulp van een CREATE TABLE
clausule. We vermelden de namen van de kolommen en plaatsen hun respectieve gegevenstypen tussen haakjes. De kolom city_id
is de refererende sleutel in deze tabel en geeft de waarde aan van de ID die is opgeslagen in de kolom id
in de tabel city
. We schrijven FOREIGN KEY REFERENCES
aan het einde van de definitie van deze kolom en volg deze met de tabel en kolom waarnaar wordt verwezen:city(id)
.
Houd er rekening mee dat u meer dan één externe sleutel voor een tabel kunt maken.
Oplossing 2 (nieuwe tabel):
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) );
Discussie:
Een andere manier om een externe sleutel te definiëren tijdens het maken van een tabel, is door de FOREIGN KEY REFERENCES
te gebruiken. clausule aan het einde van de kolomdefinities. In dit geval, na de FOREIGN KEY
clausule, duiden we de kolom met een vreemde sleutel aan. Vervolgens komen de REFERENCES
clausule samen met de naam van de tabel en kolom waarnaar wordt verwezen.
U kunt externe sleutels voor meer dan één kolom maken, zoals hieronder weergegeven:
Oplossing 3 (nieuwe tabel):
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 dit voorbeeld is de beperking fk_student_score_subject_id
is een externe sleutel die uit twee kolommen bestaat:score_id
en subject_id
. Deze twee vreemde-sleutelkolommen verwijzen naar twee kolommen in de tabel score_subject
– score_id
en subject_id
.
Hier is nog een voorbeeld:
Oplossing 4 (nieuwe tabel):
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) );
Discussie:
In deze code hebben we opnieuw de CONSTRAINT
clausule met de naam van deze beperking. Gebruik namen die gemakkelijk te lezen en te begrijpen zijn. In ons voorbeeld gebruiken we de naam fk_student_city_id
, die de relevante tabel en kolom aangeeft. Vervolgens schrijven we FOREIGN KEY
en voeg (tussen haakjes) de naam toe van de kolom die de refererende sleutel wordt. Dan hebben we de REFERENCES
clausule gevolgd door de naam van de tabel en kolom waarnaar wordt verwezen (hier:id
).
Oplossing 5 (bestaande tabel):
ALTER TABLE student ADD FOREIGN KEY (city_id) REFERENCES city(id);
Discussie:
Het is ook mogelijk om een nieuwe refererende sleutel toe te voegen aan een bestaande tabel. Hier wordt de tabel gewijzigd met behulp van een ALTER TABLE
clausule. De tabelnaam (in ons voorbeeld student
) wordt geplaatst na de ALTER TABLE
trefwoord. Vervolgens de ADD FOREIGN KEY
clausule wordt gevolgd door de naam van de kolom die als refererende sleutel zal worden gebruikt. Dan hebben we de REFERENCES clause
met de naam van de tabel waarnaar wordt verwezen en de naam van de kolom met de primaire sleutel tussen haakjes.
Houd er rekening mee dat de tabel die u aan het wijzigen bent, moet bestaan voordat deze opdracht wordt uitgevoerd.
Oplossing 6 (bestaande tabel, externe sleutelbeperking):
ALTER TABLE student ADD CONSTRAINT fk_student_city_id FOREIGN KEY (city_id) REFERENCES city(id)
Discussie:
Gebruik een query als deze als u een externe sleutelkolom een naam wilt geven als een beperking voor een bestaande tabel. Hier heet de externe sleutelbeperking fk_student_city_id
. Als u de naam van de beperking niet opgeeft, genereert de database een standaardnaam voor de beperking (die per database zal verschillen).