Внешние ключи уже не такие уж и внешние – узнайте, что это такое и как их использовать в SQL
Внешние ключи позволяют администраторам баз данных легко идентифицировать различные соединения, существующие в системе управления базами данных SQL
SQL выполняет математические операции над данными в системе управления базами данных. Эти базы данных содержат различные таблицы, каждая из которых хранит данные о конкретной сущности. Если у вас есть база данных по прокату автомобилей, то сущностью (или таблицей) в этой базе данных будут клиенты (в которой будут храниться все личные данные каждого клиента)
Эти таблицы базы данных содержат строки и столбцы, где в каждой строке хранится запись, а в каждом столбце – данные, относящиеся к конкретным атрибутам
В системе управления базами данных каждая запись (или строка) должна быть уникальной
Первичные ключи
Хотя условие заключается в том, что каждая запись в таблице должна быть отдельной, это не всегда так. Продолжая пример с базой данных по аренде автомобилей, если база данных содержит двух клиентов, каждый из которых имеет имя ‘Джон Браун’, можно ожидать, что Джон Браун вернет Mercedes-Benz, который он не арендовал
Создание первичного ключа снизит этот риск. В системе управления базами данных SQL первичный ключ – это уникальный идентификатор, который отличает одну запись от другой
Поэтому каждая запись в системе управления базами данных SQL должна иметь первичный ключ
Использование первичных ключей в базе данных
Чтобы включить первичные ключи в систему управления базами данных с помощью SQL, вы можете просто добавить их как обычный атрибут при создании новой таблицы. Таким образом, таблица клиентов будет содержать четыре атрибута (или столбца):
- CarOwnerID (в котором будет храниться первичный ключ).
- FirstName.
- LastName.
- PhoneNumber.
.
Похожие: Как создать таблицу в SQL
Теперь каждая запись о клиенте, которая попадает в базу данных, будет иметь уникальный идентификационный номер, а также имя, фамилию и номер телефона. Номер телефона недостаточно уникален, чтобы быть первичным ключом, потому что, хотя он уникален для одного человека в одно время, человек может легко изменить свой номер, что означает, что он теперь будет принадлежать кому-то другому
Пример записи с первичным ключом
/* creates a new record in the customers table */
INSERTINTOCustomersVALUES
('0004',
'John',
'Brown',
'111-999-5555');
Приведенный выше код SQL добавит новую запись в уже существующую таблицу Customers. В таблице ниже показана новая таблица клиентов с двумя записями Джона Брауна
Внешний ключ
Теперь у вас есть первичные ключи, которые однозначно отличают одного арендатора автомобиля от другого. Единственная проблема заключается в том, что в базе данных нет реальной связи между каждым Джоном Брауном и автомобилем, который он арендует
Поэтому возможность совершить ошибку все еще существует. Именно здесь в игру вступают внешние ключи. Использование первичного ключа для решения проблемы неоднозначности владения возможно только в том случае, если первичный ключ удваивается как внешний ключ
Что такое внешний ключ?
В системе управления базами данных SQL внешний ключ – это уникальный идентификатор или комбинация уникальных идентификаторов, которые связывают две или более таблиц в базе данных
Из четырех существующих систем управления базами данных SQL реляционная система управления базами данных является самой популярной. Решая, какая таблица в реляционной базе данных должна иметь внешний ключ, следует сначала определить, какая таблица является субъектом, а какая – объектом в их отношениях
Возвращаясь к базе данных по аренде автомобилей, чтобы связать каждого клиента с нужным автомобилем, вам нужно понять, что клиент (субъект) арендует автомобиль (объект). Поэтому внешний ключ должен находиться в таблице cars
Код SQL, генерирующий таблицу с внешним ключом, несколько отличается от обычного
Пример создания таблицы с внешним ключом
/* creates a new cars table in the car rental database */
CREATETABLECars.
LicenseNumber varchar(30) NOTNULLPRIMARY KEY,
CarType varchar(30) NOTNULL
CustomerID varchar(30) FOREIGN KEY REFERENCES Customers(CustomerID)
);
Как видно из приведенного выше кода, внешний ключ должен быть явно идентифицирован как таковой, вместе со ссылкой на первичный ключ, который подключается к новой таблице
Похожие: Шпаргалка по основным командам SQL для начинающих
Чтобы добавить запись в новую таблицу, необходимо убедиться, что значение в поле внешнего ключа совпадает со значением в поле первичного ключа исходной таблицы
Добавление записи с помощью внешнего ключа
/* creates a new record in the cars table */
INSERTINTOCarsVALUES
'100012'
'Mercedes-Benz'
'0004');
Приведенный выше код создает новую запись в новой таблице Cars , выдавая следующий результат
Таблица Cars
Из приведенной выше таблицы вы можете определить правильного Джона Брауна, который арендует Mercedes-Benz, по внешнему ключу в записи
Продвижение внешних ключей
Существует еще два способа использования внешнего ключа в базе данных
Если вы вспомните приведенное выше определение внешнего ключа, то обнаружите, что в нем говорится, что внешний ключ может быть уникальным идентификатором или комбинацией уникальных идентификаторов
Возвращаясь к примеру базы данных аренды автомобилей, вы увидите, что создание новой записи (об одном и том же автомобиле) каждый раз, когда клиент арендует этот автомобиль, противоречит цели таблицы Cars. Если автомобили продаются и продаются одному клиенту один раз, существующая база данных идеальна; но если автомобили сдаются в аренду, есть лучший способ представить эти данные
Составные ключи
Составной ключ имеет два или более уникальных идентификатора. В реляционной базе данных могут быть случаи, когда использование одного внешнего ключа недостаточно полно представляет отношения, существующие в этой базе данных
В примере с арендой автомобиля наиболее практичным подходом является создание новой таблицы, в которой хранятся данные об аренде. Чтобы информация в таблице аренды автомобилей была полезной, она должна быть связана как с таблицей автомобилей, так и с таблицей клиентов
Создание таблицы с составными внешними ключами
/* creates a CarRental table in the car rental database */
CREATETABLECarRental.
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 не является хорошей комбинацией)
Однако создание составного ключа, который указывает, какой клиент, какой автомобиль и в какой день, является отличным уникальным ключом. Этот уникальный ключ представляет собой одновременно составной внешний ключ и составной первичный ключ
Иностранные первичные ключи
О да, внешние первичные ключи действительно выходят. Хотя официального названия для этого нет, внешний ключ также может быть первичным ключом в той же таблице. Это происходит, когда вы создаете новую таблицу, содержащую специализированные данные о существующей сущности (или записи в другой таблице)
Скажем, Фред (который работает в компании по прокату автомобилей) находится в базе данных компании в таблице сотрудников. Через несколько лет он становится супервайзером и добавляется в таблицу supervisor
Фред все еще является сотрудником и будет иметь тот же идентификационный номер. Таким образом, идентификатор сотрудника Фреда теперь находится в таблице supervisor в качестве внешнего ключа, который также станет первичным ключом в этой таблице (поскольку нет смысла создавать новый идентификационный номер для Фреда теперь, когда он стал супервайзером)
Теперь вы можете идентифицировать внешние ключи в базах данных SQL
Внешние ключи соединяют различные таблицы в базе данных SQL. Из этой статьи вы узнаете, что такое внешний ключ, как он работает и почему их важно иметь в базе данных. Вы также поймете основные и даже более сложные формы внешних ключей
Если вы считаете, что внешние ключи – это интересно, то вы будете просто в восторге, когда начнете использовать операции project и select для запросов к базам данных SQL
Комментировать