FOREIGN KEY - связи между таблицами
Внешние ключи позволяют установить связи между таблицами. Внешний ключ устанавливается для столбцов из зависимой, подчиненной таблицы, и указывает на один из столбцов из главной таблицы. Как правило, внешний ключ указывает на первичный ключ из связанной главной таблицы.
Общий синтаксис установки внешнего ключа на уровне таблицы:
CONSTRAINT имя_ограничения
FOREIGN KEY (столбец_1, столбец_2)
REFERENCES главная_таблица (столбец_главной_таблицы_1, столбец_главной_таблицы_2)
ON DELETE действие
ON UPDATE действие
Для создания ограничения внешнего ключа после FOREIGN KEY
указывается столбец таблицы, который
будет представляет внешний ключ. А после ключевого слова REFERENCES
указывается имя
связанной таблицы, а затем в скобках имя связанного столбца, на который будет указывать внешний ключ. После
выражения REFERENCES
идут выражения ON DELETE
и ON UPDATE
, которые задают действие при
удалении и обновлении строки из главной таблицы соответственно.
Например, определим две таблицы и свяжем их посредством внешнего ключа:
CREATE TABLE Customers
(
Id INT PRIMARY KEY AUTO_INCREMENT,
Age INT,
FirstName VARCHAR(20) NOT NULL,
LastName VARCHAR(20) NOT NULL,
Phone VARCHAR(20) NOT NULL UNIQUE
);
CREATE TABLE Orders
(
Id INT PRIMARY KEY AUTO_INCREMENT,
CustomerId INT,
CreatedAt Date,
FOREIGN KEY (CustomerId) REFERENCES Customers (Id)
);
В данном случае определены таблицы Customers
и Orders
. Customers
является главной и представляет клиента. Orders
является зависимой и представляет заказ, сделанный клиентом. Таблица Orders
через столбец CustomerId
связана с таблицей Customers
и ее
столбцом Id
. То есть столбец CustomerId
является внешним ключом, который указывает на столбец Id
из таблицы Customers
.
С помощью оператора CONSTRAINT
можно задать имя для ограничения внешнего ключа:
CREATE TABLE Orders
(
Id INT PRIMARY KEY AUTO_INCREMENT,
CustomerId INT,
CreatedAt Date,
CONSTRAINT orders_custonmers_fk
FOREIGN KEY (CustomerId) REFERENCES Customers (Id)
);
ON DELETE и ON UPDATE
С помощью выражений ON DELETE и ON UPDATE можно установить действия, которые выполняются соответственно при удалении и изменении связанной строки из главной таблицы. В качестве действия могут использоваться следующие опции:
- CASCADE автоматически удаляет или изменяет строки из зависимой таблицы при удалении или изменении связанных строк в главной таблице
- SET NULL при удалении или обновлении связанной строки из главной таблицы устанавливает для столбца внешнего ключа значение NULL. (В этом случае столбец внешнего ключа должен поддерживать установку NULL)
- RESTRICT отклоняет удаление или изменение строк в главной таблице при наличии связанных строк в зависимой таблице
-
NO ACTION то же самое, что и
RESTRICT
-
SET DEFAULT при удалении связанной строки из главной таблицы устанавливает для
столбца внешнего ключа значение по умолчанию, которое задается с помощью атрибуты
DEFAULT
. Несмотря на то, что данная опция в принципе доступна, однако движокInnoDB
не поддерживает данное выражение
Каскадное удаление
Каскадное удаление позволяет при удалении строки из главной таблицы автоматически удалить все связанные строки из зависимой таблицы. Для этого применяется опция CASCADE:
CREATE TABLE Orders
(
Id INT PRIMARY KEY AUTO_INCREMENT,
CustomerId INT,
CreatedAt Date,
FOREIGN KEY (CustomerId) REFERENCES Customers (Id) ON DELETE CASCADE
);
Подобным образом работает и выражение ON UPDATE CASCADE. При изменении значения первичного
ключа автоматически изменится
значение связанного с ним внешнего ключа. Однако поскольку первичные ключи изменяются очень редко, да и с принципе
не рекомендуется использовать в
качестве первичных ключей столбцы с изменяемыми значениями, то на практике выражение ON UPDATE
используется редко.
Установка NULL
При установки для внешнего ключа опции SET NULL необходимо, чтобы столбец внешнего ключа
допускал значение NULL
:
CREATE TABLE Orders
(
Id INT PRIMARY KEY AUTO_INCREMENT,
CustomerId INT,
CreatedAt Date,
FOREIGN KEY (CustomerId) REFERENCES Customers (Id) ON DELETE SET NULL
);