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).