Внешние ключи Внешний ключ — это столбец одной таблицы, значения которого совпадают со значениями столбца, являющегося первичным ключом другой таблицы. Внешние ключи — очень важная часть механизма обеспечения ссылочной целостности данных. Чтобы разобраться в том, что собой представляют внешние ключи, рассмотрим следующий пример.
Таблица Orders содержит единственную строку для каждого заказа, зафиксированного в базе данных. Информация о клиенте хранится в таблице Customers. Заказы в таблице Orders связаны с определенными строками в таблице Customers за счет идентификатора клиента. Идентификатор клиента является первичным ключом в таблице Customers; каждый клиент имеет уникальный идентификатор. Номер заказа является первичным ключом в таблице Orders; каждый заказ имеет свой уникальный номер.
Значения в столбце таблицы Orders, содержащем идентификаторы клиентов, не обязательно уникальные. Если клиент сделал несколько заказов, может быть несколько строк с тем же самым идентификатором клиента (хотя каждая из них будет иметь свой номер заказа). В то же время единственные значения, которые могут появиться в столбце идентификаторов клиента таблицы Orders, — это идентификаторы клиентов из таблицы Customers.
Именно так и образуются внешние ключи. В нашем примере внешний ключ определен как столбец идентификаторов клиента, содержащихся в первичном ключе таблицы Customers, так что этот столбец может принимать только значения, имеющиеся в первичном ключе таблицы Customers.
Вот один из способов определения внешнего ключа:
CREATE TABLE Orders
(
order_num INTEGER NOT NULL PRIMARY KEY,
order_date DATETIME NOT NULL,
cust_id CHAR (10) NOT NULL REFERENCES
Customers (cust_id)
);
Это определение таблицы, использующее ключевое слово REFERENCES для утверждения того факта, что любое значение в столбце cust_id должно быть также и в столбце cust_id таблицы Customers.
Того же результата можно было бы добиться с использованием синтаксиса CONSTRAINT в операторе ALTER TABLE:
ALTER TABLE Customers
ADD CONSTRAINT
FOREIGN KEY (cust_id) REFERENCES Customers (cust_id)
Внешние ключи могут воспрепятствовать случайному удалению данных
В дополнение к тому, что внешние ключи помогают принудительно сохранять целостность ссылочных данных, они могут выполнять много других важных функций. После того как внешний ключ определен, ваша СУБД не позволит удалять строки, связанные со строками в других таблицах. Например, вы не сможете удалить информацию о клиенте, у которого есть заказы. Единственный способ удалить информацию о таком клиенте состоит в предварительном удалении связанных с ним заказов (для чего, в свою очередь, нужно удалить информацию о предметах этих заказов). Поскольку требуется столь методичное и целенаправленное удаление, внешние ключи могут оказать помощь в предотвращении случайного удаления данных.
Однако в некоторых СУБД поддерживается возможность, получившая название каскадноеудаление. Если такая функция реализована, можно удалять все связанные с этой строкой данные при удалении ее из таблицы. Например, если возможно каскадное удаление и имя клиента удаляется из таблицы Customers, все связанные с его заказом строки удаляются автоматически.