Problem:
Du vill skapa en främmande nyckel för en tabell i en databas.
Exempel:
Vi skulle vilja skapa en tabell med namnet student
som innehåller en främmande nyckel som refererar till id
kolumnen i tabellen city
.
Lösning 1 (ny tabell):
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:
För att skapa en ny tabell som innehåller en främmande nyckelkolumn som refererar till en annan tabell, använd nyckelordet FOREIGN KEY REFERENCES
i slutet av definitionen av den kolumnen. Följ det med namnet på den refererade tabellen och namnet på den refererade kolumnen inom parentes.
I vårt exempel skapar vi tabellen student
med en CREATE TABLE
klausul. Vi listar kolumnernas namn och sätter deras respektive datatyper inom parentes. Kolumnen city_id
är den främmande nyckeln i denna tabell och indikerar värdet på ID:t som är lagrat i kolumnen id
i tabellen city
. Vi skriver FOREIGN KEY REFERENCES
i slutet av definitionen av denna kolumn och följ den med den refererade tabellen och kolumnen:city(id)
.
Tänk på att du kan skapa mer än en främmande nyckel för en tabell.
Lösning 2 (ny tabell):
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:
Ett annat sätt att definiera en främmande nyckel under tabellskapandet är att använda FOREIGN KEY REFERENCES
klausul i slutet av kolumndefinitionerna. I det här fallet efter FOREIGN KEY
sats, utser vi kolumnen för främmande nyckel. Därefter kommer REFERENCES
klausul tillsammans med namnet på den refererade tabellen och kolumnen.
Du kan skapa främmande nycklar på mer än en kolumn, som visas nedan:
Lösning 3 (ny tabell):
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 det här exemplet är begränsningen fk_student_score_subject_id
är en främmande nyckel som består av två kolumner:score_id
och subject_id
. Dessa två kolumner för främmande nyckel refererar till två kolumner i tabellen score_subject
– score_id
och subject_id
.
Här är ett annat exempel:
Lösning 4 (ny tabell):
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 den här koden har vi återigen CONSTRAINT
klausul med namnet på denna begränsning. Använd namn som är lätta att läsa och förstå. I vårt exempel använder vi namnet fk_student_city_id
, som anger relevant tabell och kolumn. Därefter skriver vi FOREIGN KEY
och lägg till (inom parentes) namnet på kolumnen som blir den främmande nyckeln. Sedan har vi REFERENCES
sats följt av namnet på den refererade tabellen och kolumnen (här:id
).
Lösning 5 (befintlig tabell):
ALTER TABLE student ADD FOREIGN KEY (city_id) REFERENCES city(id);
Diskussion:
Det är också möjligt att lägga till en ny främmande nyckel till en befintlig tabell. Här ändras tabellen med en ALTER TABLE
klausul. Tabellnamnet (i vårt exempel, student
) placeras efter ALTER TABLE
nyckelord. Därefter ADD FOREIGN KEY
sats följs av namnet på kolumnen som kommer att användas som främmande nyckel. Sedan har vi REFERENCES clause
med namnet på den refererade tabellen och namnet på primärnyckelkolumnen inom parentes.
Observera att tabellen du ändrar måste finnas innan det här kommandot körs.
Lösning 6 (befintlig tabell, begränsning av främmande nyckel):
ALTER TABLE student ADD CONSTRAINT fk_student_city_id FOREIGN KEY (city_id) REFERENCES city(id)
Diskussion:
Använd en fråga som denna om du vill namnge en kolumn för främmande nyckel som en begränsning för en befintlig tabell. Här heter den främmande nyckelbegränsningen fk_student_city_id
. Om du inte anger begränsningsnamnet genererar databasen ett standard begränsningsnamn (som kommer att variera beroende på databas).