Problem:
Chcesz utworzyć klucz obcy dla tabeli w bazie danych.
Przykład:
Chcielibyśmy utworzyć tabelę o nazwie student
który zawiera klucz obcy, który odwołuje się do id
kolumna w tabeli city
.
Rozwiązanie 1 (nowa tabela):
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) );
Dyskusja:
Aby utworzyć nową tabelę zawierającą kolumnę klucza obcego, która odwołuje się do innej tabeli, użyj słowa kluczowego FOREIGN KEY REFERENCES
na końcu definicji tej kolumny. Postępuj zgodnie z nazwą tabeli, do której się odwołuje, i nazwą kolumny, do której się odwołuje, w nawiasach.
W naszym przykładzie tworzymy tabelę student
za pomocą CREATE TABLE
klauzula. Podajemy nazwy kolumn i umieszczamy odpowiadające im typy danych w nawiasach. Kolumna city_id
jest kluczem obcym w tej tabeli i wskazuje wartość identyfikatora przechowywanego w kolumnie id
w tabeli city
. Piszemy FOREIGN KEY REFERENCES
na końcu definicji tej kolumny i po niej z odnośną tabelą i kolumną:city(id)
.
Pamiętaj, że możesz utworzyć więcej niż jeden klucz obcy dla tabeli.
Rozwiązanie 2 (nowa tabela):
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) );
Dyskusja:
Innym sposobem zdefiniowania klucza obcego podczas tworzenia tabeli jest użycie FOREIGN KEY REFERENCES
klauzula na końcu definicji kolumn. W tym przypadku po FOREIGN KEY
klauzuli, wyznaczamy kolumnę klucza obcego. Następnie pojawia się REFERENCES clause
klauzula wraz z nazwą odnośnej tabeli i kolumny.
Możesz tworzyć klucze obce w więcej niż jednej kolumnie, jak pokazano poniżej:
Rozwiązanie 3 (nowa tabela):
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) );
W tym przykładzie ograniczenie fk_student_score_subject_id
to klucz obcy składający się z dwóch kolumn:score_id
i subject_id
. Te dwie kolumny klucza obcego odnoszą się do dwóch kolumn w tabeli score_subject
– score_id
i subject_id
.
Oto kolejny przykład:
Rozwiązanie 4 (nowa tabela):
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) );
Dyskusja:
W tym kodzie ponownie mamy CONSTRAINT
klauzula z nazwą tego ograniczenia. Używaj nazw, które są łatwe do odczytania i zrozumienia. W naszym przykładzie używamy nazwy fk_student_city_id
, który wskazuje odpowiednią tabelę i kolumnę. Następnie piszemy FOREIGN KEY
i dodaj (w nawiasach) nazwę kolumny, która stanie się kluczem obcym. Następnie mamy REFERENCES clause
klauzula, po której następuje nazwa tabeli i kolumny, do której się odwołuje (tutaj:id
).
Rozwiązanie 5 (istniejąca tabela):
ALTER TABLE student ADD FOREIGN KEY (city_id) REFERENCES city(id);
Dyskusja:
Możliwe jest również dodanie nowego klucza obcego do istniejącej tabeli. Tutaj tabela jest zmieniana za pomocą ALTER TABLE
klauzula. Nazwa tabeli (w naszym przykładzie student
) jest umieszczana po ALTER TABLE
słowo kluczowe. Następnie ADD FOREIGN KEY
po klauzuli następuje nazwa kolumny, która będzie używana jako klucz obcy. Następnie mamy klauzulę REFERENCES clause
z nazwą tabeli, do której się odwołuje, i nazwą kolumny klucza podstawowego w nawiasach.
Pamiętaj, że modyfikowana tabela musi istnieć przed wykonaniem tego polecenia.
Rozwiązanie 6 (istniejąca tabela, ograniczenie klucza obcego):
ALTER TABLE student ADD CONSTRAINT fk_student_city_id FOREIGN KEY (city_id) REFERENCES city(id)
Dyskusja:
Użyj takiego zapytania, jeśli chcesz nazwać kolumnę klucza obcego jako ograniczenie dla istniejącej tabeli. Tutaj ograniczenie klucza obcego nazywa się fk_student_city_id
. Jeśli nie określisz nazwy ograniczenia, baza danych wygeneruje domyślną nazwę ograniczenia (która będzie się różnić w zależności od bazy danych).