Проблем:
Искате да създадете външен ключ за таблица в база данни.
Пример:
Бихме искали да създадем таблица с име student
който съдържа външен ключ, който препраща към id
колона в таблицата city
.
Решение 1 (нова таблица):
СЪЗДАВАНЕ НА ТАБЛИЦА ученик (id INT ПРАВИЛЕН КЛЮЧ, първо_име VARCHAR(100) NOT NULL, фамилия VARCHAR(100) NOT NULL,city_id INT ВЪНШНИ КЛЮЧИ РЕФЕРЕНЦИИ city(id));
Дискусия:
За да създадете нова таблица, съдържаща колона с външен ключ, която препраща към друга таблица, използвайте ключовата дума FOREIGN KEY REFERENCES
в края на определението на тази колона. Следвайте това с името на посочената таблица и името на реферираната колона в скоби.
В нашия пример създаваме таблицата student
с помощта на CREATE TABLE
клауза. Изброяваме имената на колоните и поставяме съответните им типове данни в скоби. Колоната city_id
е външният ключ в тази таблица и показва стойността на идентификатора, съхранен в колоната id
в таблицата city
. Пишем FOREIGN KEY REFERENCES
в края на дефиницията на тази колона и я последвайте с посочената таблица и колона:city(id)
.
Имайте предвид, че можете да създадете повече от един външен ключ за таблица.
Решение 2 (нова таблица):
СЪЗДАВАНЕ НА ТАБЛИЦА ученик (id INT ПРАВИЛЕН КЛЮЧ, първо_име VARCHAR(100) НЕ NULL, фамилия VARCHAR(100) НЕ NULL,city_id INT,ЧУЖЕН КЛЮЧ (city_id) РЕФЕРЕНЦИИ city(id));
Дискусия:
Друг начин да дефинирате външен ключ по време на създаване на таблица е да използвате FOREIGN KEY REFERENCES
клауза в края на дефинициите на колоните. В този случай след FOREIGN KEY
клауза, ние обозначаваме колоната за външен ключ. Следва REFERENCES
клауза заедно с името на посочената таблица и колона.
Можете да създадете външни ключове в повече от една колона, както е показано по-долу:
Решение 3 (нова таблица):
CREATE TABLE студент (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_idscore_subject_ids score FOREIGN_ubject score FOREIGN_id_результат FOREIGN_ubject_id_резултат FOREIGN_ubject_id_ );
В този пример ограничението fk_student_score_subject_id
е външен ключ, състоящ се от две колони:score_id
и subject_id
. Тези две колони с външни ключове се отнасят до две колони в таблицата score_subject
– score_id
и subject_id
.
Ето още един пример:
Решение 4 (нова таблица):
СЪЗДАВАНЕ НА ТАБЛИЦА ученик (id INT ПРАВИЛЕН КЛЮЧ, първо_име VARCHAR(100) НЕ NULL, фамилия VARCHAR(100) NOT NULL,city_id INT, ОГРАНИЧЕНИЕ fk_student_city_id FOREIGN KEY (city_id) REFERENCES city(id));Дискусия:
В този код отново имаме
CONSTRAINT
клауза с името на това ограничение. Използвайте имена, които са лесни за четене и разбиране. В нашия пример използваме иметоfk_student_city_id
, което показва съответната таблица и колона. След това пишемFOREIGN KEY
и добавете (в скоби) името на колоната, която става външен ключ. Тогава имамеREFERENCES
клауза, последвана от името на посочената таблица и колона (тук:id
).Решение 5 (съществуваща таблица):
ПРОМЕНЯТ ТАБЛИЦА студент ДОБАВЯНЕ НА ВЪНШЕН КЛЮЧ (city_id) СПРАВКИ city(id);Дискусия:
Възможно е също да добавите нов външен ключ към съществуваща таблица. Тук таблицата се променя с помощта на
ALTER TABLE
клауза. Името на таблицата (в нашия примерstudent
) се поставя следALTER TABLE
ключова дума. След товаADD FOREIGN KEY
клаузата е последвана от името на колоната, която ще се използва като външен ключ. Тогава имамеREFERENCES clause
с името на посочената таблица и името на колоната с първичен ключ в скоби.Имайте предвид, че таблицата, която променяте, трябва да съществува, преди тази команда да бъде изпълнена.
Решение 6 (съществуваща таблица, ограничение на външния ключ):
ПРОМЕНЯ ТАБЛИЦА ученик ДОБАВЯНЕ НА ОГРАНИЧЕНИЕ fk_student_city_id ВЪНШЕН КЛЮЧ (city_id) РЕФЕРЕНЦИИ city(id)Дискусия:
Използвайте заявка като тази, ако искате да наименувате колона с външен ключ като ограничение за съществуваща таблица. Тук ограничението на външния ключ се нарича
fk_student_city_id
. Ако не посочите името на ограничението, базата данни генерира име на ограничение по подразбиране (което ще варира според базата данни).