Problem:
Du vil oprette en fremmednøgle til en tabel i en database.
Eksempel:
Vi vil gerne oprette en tabel med navnet student
der indeholder en fremmednøgle, der refererer til id
kolonne i tabellen city
.
Løsning 1 (ny 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) );
Diskussion:
For at oprette en ny tabel, der indeholder en fremmednøglekolonne, der refererer til en anden tabel, skal du bruge søgeordet FOREIGN KEY REFERENCES
i slutningen af definitionen af denne kolonne. Følg det med navnet på den refererede tabel og navnet på den refererede kolonne i parentes.
I vores eksempel opretter vi tabellen student
ved hjælp af en CREATE TABLE
klausul. Vi lister kolonnernes navne og sætter deres respektive datatyper i parentes. Kolonnen city_id
er fremmednøglen i denne tabel og angiver værdien af ID'et gemt i kolonnen id
i tabellen city
. Vi skriver FOREIGN KEY REFERENCES
i slutningen af definitionen af denne kolonne og følg den med den refererede tabel og kolonne:city(id)
.
Husk, at du kan oprette mere end én fremmednøgle til en tabel.
Løsning 2 (ny 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) );
Diskussion:
En anden måde at definere en fremmednøgle under tabeloprettelse er at bruge FOREIGN KEY REFERENCES
klausul i slutningen af kolonnedefinitionerne. I dette tilfælde efter FOREIGN KEY
klausul, udpeger vi kolonnen med fremmednøgle. Dernæst kommer REFERENCES
klausul sammen med navnet på den refererede tabel og kolonne.
Du kan oprette fremmednøgler på mere end én kolonne, som vist nedenfor:
Løsning 3 (ny 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) );
I dette eksempel er begrænsningen fk_student_score_subject_id
er en fremmednøgle bestående af to kolonner:score_id
og subject_id
. Disse to fremmednøglekolonner refererer til to kolonner i tabellen score_subject
– score_id
og subject_id
.
Her er et andet eksempel:
Løsning 4 (ny 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) );
Diskussion:
I denne kode har vi igen CONSTRAINT
klausul med navnet på denne begrænsning. Brug navne, der er lette at læse og forstå. I vores eksempel bruger vi navnet fk_student_city_id
, som angiver den relevante tabel og kolonne. Dernæst skriver vi FOREIGN KEY
og tilføj (i parentes) navnet på den kolonne, der bliver fremmednøglen. Så har vi REFERENCES
klausul efterfulgt af navnet på den refererede tabel og kolonne (her:id
).
Løsning 5 (eksisterende tabel):
ALTER TABLE student ADD FOREIGN KEY (city_id) REFERENCES city(id);
Diskussion:
Det er også muligt at tilføje en ny fremmednøgle til en eksisterende tabel. Her er tabellen ændret ved hjælp af en ALTER TABLE
klausul. Tabellens navn (i vores eksempel, student
) er placeret efter ALTER TABLE
søgeord. Dernæst ADD FOREIGN KEY
klausulen efterfølges af navnet på den kolonne, der vil blive brugt som fremmednøgle. Så har vi REFERENCES clause
med navnet på den refererede tabel og navnet på den primære nøglekolonne i parentes.
Bemærk, at den tabel, du ændrer, skal eksistere, før denne kommando udføres.
Løsning 6 (eksisterende tabel, fremmednøglebegrænsning):
ALTER TABLE student ADD CONSTRAINT fk_student_city_id FOREIGN KEY (city_id) REFERENCES city(id)
Diskussion:
Brug en forespørgsel som denne, hvis du vil navngive en fremmednøglekolonne som en begrænsning for en eksisterende tabel. Her er den fremmede nøgle-begrænsning navngivet fk_student_city_id
. Hvis du ikke angiver begrænsningsnavnet, genererer databasen et standard begrænsningsnavn (som vil variere fra database til).