Что такое внешние ключи в базах данных SQL?

Внешние ключи позволяют администраторам баз данных легко идентифицировать различные соединения, существующие в системе управления базой данных SQL.

SQL выполняет математические операции с данными в системе управления базами данных. Эти базы данных содержат разные таблицы, каждая из которых хранит данные об определенной сущности. Если у вас есть база данных по аренде автомобилей, сущностью (или таблицей) в этой базе данных будут клиенты (которые будут хранить все личные данные о каждом клиенте).

Эти таблицы базы данных содержат строки и столбцы, где каждая строка содержит запись, а каждый столбец содержит данные, относящиеся к атрибутам.

В системе управления базами данных каждая запись (или строка) должна быть уникальной.

Первичные ключи

Хотя оговорено, что каждая запись в таблице должна быть отдельной, это не всегда так. Продолжая пример с базой данных по аренде автомобилей, если база данных содержит двух клиентов, каждый из которых носит имя «Джон Браун», можно ожидать, что Джон Браун вернет Mercedes-Benz, который он не арендовал.

Создание первичного ключа снизит этот риск. В системе управления базой данных SQL первичный ключ – это уникальный идентификатор, который отличает одну запись от другой.

Следовательно, каждая запись в системе управления базами данных SQL должна иметь первичный ключ.

Использование первичных ключей в базе данных

Чтобы включить первичные ключи в систему управления базами данных с использованием SQL, вы можете просто добавить его как обычный атрибут при создании новой таблицы. Таким образом, таблица клиентов будет содержать четыре атрибута (или столбца):

  • CarOwnerID (в котором будет храниться первичный ключ)
  • Имя
  • Фамилия
  • Телефонный номер

Связанный: Как создать таблицу в SQL

Теперь каждая запись о клиенте, попадающая в базу данных, будет иметь уникальный идентификационный номер, а также имя, фамилию и номер телефона. Номер телефона недостаточно уникален, чтобы быть первичным ключом, потому что, хотя он уникален для одного человека за раз, человек может легко изменить свой номер, что означает, что теперь он будет принадлежать кому-то другому.

Запись с примером первичного ключа

 /* creates a new record in the customers table */
INSERT INTO Customers VALUES
('0004',
'John',
'Brown',
'111-999-5555');

Приведенный выше код SQL добавит новую запись в уже существующую таблицу Customers . В таблице ниже показана новая таблица клиентов с двумя записями Джона Брауна.

Внешний ключ

Теперь у вас есть первичные ключи, которые однозначно отличают одного арендатора автомобиля от другого. Единственная проблема в том, что в базе данных нет реальной связи между каждым Джоном Брауном и машиной, которую он арендует.

Следовательно, возможность ошибиться все же существует. Здесь в игру вступают внешние ключи. Использование первичного ключа для решения проблемы неоднозначности владения возможно только в том случае, если первичный ключ дублирует внешний ключ.

Что такое внешний ключ?

В системе управления базой данных SQL внешний ключ – это уникальный идентификатор или комбинация уникальных идентификаторов, которые соединяют две или более таблиц в базе данных.

Из четырех существующих систем управления базами данных SQL наиболее популярной является система управления реляционными базами данных. Решая, какая таблица в реляционной базе данных должна иметь внешний ключ, вы должны сначала определить, какая таблица является субъектом, а какая – объектом в их отношениях.

Возвращаясь к базе данных по аренде автомобилей, чтобы связать каждого клиента с нужным автомобилем, вам необходимо понять, что клиент (субъект) арендует автомобиль (объект). Следовательно, внешний ключ должен быть в таблице cars.

Код SQL, который генерирует таблицу с внешним ключом, немного отличается от нормы.

Создание таблицы с примером внешнего ключа

 /* creates a new cars table in the car rental database */
CREATE TABLE Cars
(
LicenseNumber varchar(30) NOT NULL PRIMARY KEY,
CarType varchar(30) NOT NULL,
CustomerID varchar(30) FOREIGN KEY REFERENCES Customers(CustomerID)
);

Как вы можете видеть в приведенном выше коде, внешний ключ должен быть явно идентифицирован как таковой вместе со ссылкой на первичный ключ, который подключается к новой таблице.

Связанный: Шпаргалка по основным командам SQL для начинающих

Чтобы добавить запись в новую таблицу, вам необходимо убедиться, что значение в поле внешнего ключа соответствует значению в поле первичного ключа исходной таблицы.

Пример добавления записи с внешним ключом

 /* creates a new record in the cars table */
INSERT INTO Cars VALUES
('100012',
'Mercedes-Benz',
'0004');

Приведенный выше код создает новую запись в новой таблице Cars , что дает следующий результат.

Таблица автомобилей

Из приведенной выше таблицы вы можете определить того Джона Брауна, который арендует Mercedes-Benz, по внешнему ключу, указанному в записи.

Предварительные внешние ключи

Есть два других способа использовать внешний ключ в базе данных.

Если вы посмотрите на определение внешнего ключа, приведенное выше, вы обнаружите, что в нем говорится, что внешний ключ может быть уникальным идентификатором или комбинацией уникальных идентификаторов.

Вернувшись к примеру с базой данных по аренде автомобилей, вы увидите, что создание новой записи (той же машины) каждый раз, когда клиент арендует эту машину, противоречит цели таблицы Cars . Если автомобили выставлены на продажу и проданы одному покупателю один раз, существующая база данных идеальна; но, учитывая, что автомобили сдаются в аренду, есть лучший способ представить эти данные.

Составные ключи

Составной ключ имеет два или более уникальных идентификатора. В реляционной базе данных будут случаи, когда использование одного внешнего ключа не будет в достаточной степени отражать отношения, существующие в этой базе данных.

В примере с прокатом автомобилей наиболее практичным подходом является создание новой таблицы, в которой хранятся данные об аренде. Чтобы информация в таблице аренды автомобилей была полезной, она должна подключаться как к таблице автомобилей, так и к таблицам клиентов.

Создание таблицы с составными внешними ключами

 /* creates a CarRental table in the car rental database */
CREATE TABLE CarRental
(
DateRented DATE NOT NULL,
LicenseNumber varchar(30) NOT NULL FOREIGN KEY REFERENCES Cars(LicenseNumber),
CustomerID varchar(30) NOT NULL FOREIGN KEY REFERENCES Customers(CustomerID),
PRIMARY KEY (DateRented, LicenseNumber, CustomerID)
);

Приведенный выше код отражает важный момент; хотя таблица в базе данных SQL может иметь более одного внешнего ключа, она может иметь только один первичный ключ. Это потому, что должен быть только один уникальный способ идентифицировать запись.

Чтобы получить уникальный ключ, необходимо объединить все три атрибута в таблице. Клиент может арендовать более одного автомобиля в один и тот же день (поэтому CustomerID и DateRented – не лучшая комбинация). Более одного клиента также могут арендовать один и тот же автомобиль в один и тот же день (поэтому LicenseNumber и DateRented – не лучшая комбинация) .

Однако создание составного ключа, который сообщает, какой клиент, какая машина и в какой день делает отличный уникальный ключ. Этот уникальный ключ представляет собой составной внешний ключ и составной первичный ключ.

Иностранные первичные ключи

Ах да, внешние первичные ключи выходят. Хотя официального названия для него нет, внешний ключ также может быть первичным ключом в той же таблице. Это происходит, когда вы создаете новую таблицу, содержащую специализированные данные о существующей сущности (или записи в другой таблице).

Скажем, Фред (который работает в компании по аренде автомобилей) находится в базе данных компании под таблицей сотрудников. Через несколько лет он становится супервизором и попадает в список супервизоров.

Фред все еще работает и будет иметь тот же идентификационный номер. Таким образом, идентификатор сотрудника Фреда теперь находится в таблице супервизора в качестве внешнего ключа, который также станет первичным ключом в этой таблице (поскольку нет смысла создавать новый идентификационный номер для Фреда, когда он является супервизором).

Теперь вы можете определять внешние ключи в базах данных SQL

Внешние ключи соединяют разные таблицы в базе данных SQL. Из этой статьи вы узнаете, что такое внешний ключ, как он работает и почему так важно иметь их в базе данных. Вы также понимаете основные и даже более сложные формы внешних ключей.

Если вы считаете, что внешние ключи интересны, у вас будет рабочий день, когда вы начнете использовать проект и операции выбора для запроса своих баз данных SQL.