Идея внешнего ключа довольно проста.
В таблице products_rating
мы храним значение для user_id
.
И значение, которое мы там сохранили, представляет собой столбец id
из строки в таблице user
. Это устанавливает отношение между строкой в products_rating
и строкой в user
.
Мы могли бы получить имя и адрес электронной почты пользователя, который оставил рейтинг продукта
SELECT u.name
, u.email
, r.rate
, r.comment
FROM product_rating r
JOIN user u
ON u.id = r.user_id
WHERE ...
A FOREIGN KEY
- это ограничение , которое реализует правило. Правило, которое мы хотим реализовать, заключается в том, что мы хотим разрешить хранить только допустимых user.id
значений в product_rating.user_id
.
Например, если мы попытаемся сохранить значение '42' в столбце product_rating.user_id
, база данных будет проверять, чтобы значение '42' появилось в строке в таблице user
(в id
) столбец.
Синтаксис, который мы используем для реализации этого ограничения 1034 *, будет в таблице product_rating
:
ALTER TABLE `product_rating`
ADD CONSTRAINT -- we are adding a constraint
`FK_product_rating_user` -- the name we assign to the constraint
FOREIGN KEY -- the type of constraint
(`user_id`) -- the column(s) in this table
REFERENCES -- refer to
`user` -- the name of the "foreign" table
(`id`) -- the column(s) in the "foreign" table
Мы можем добавить дополнительную конфигурацию, которая влияет на поведение ...
ON DELETE RESTRICT
ON UPDATE CASCADE
Это реализует правило ... если мы пытаемся присвоить значение столбцу user_id
в этой таблице, и это значение не найдено в строке в столбце user
table id
, возникает ошибка, и утверждение не выполняется.
Это правило также гласит, что если мы попытаемся удалить строку из user
, если в product_rating
есть строки, имеющие значение user_id
, которое соответствует значению id
удаляемой строки , выдается ошибка, и инструкция не выполняется.
Правило также гласит, что мы обновляем строку в user
и присваиваем новое значение столбцу id
, чем любые строки в product_rating
, имеющие значение user_id
, соответствующее старому id
значение будет обновлено, чтобы присвоить новое значение id
столбцу user_id
... с сохранением отношения между строками.
Также обратите внимание, что это подразумевает отношения «один ко многим». Пользователь может относиться к нулю, одному или нескольким product_rating
. product_rating
ассоциируется с one user
. (Если столбец user_id
допускает сохранение значений NULL, значение NULL означает, что строка в product_rating
имеет значение , а не , связанную с любым пользователем.)
Это всего лишь приблизительный обзор ограничений FOREIGN KEY
.
Основная идея состоит в том, что мы устанавливаем отношение между строками, сохраняя общее значение. В нашем примере мы используем общее значение '42' в столбце id
строки в таблице user
и в столбце user_id
одной (или нескольких) строк в таблице * 1083. * таблица.
Без ограничения внешнего ключа база данных позволяет нам сохранять любое значение в столбце user_id
. Мы можем хранить «43» или «8670», и не имеет значения, появляются эти значения в user.id
или нет.
Внешний ключ, который мы определили , ограничивает (ограничивает), какие значения мы можем хранить в столбце user_id
. Когда мы пытаемся добавить или изменить строку в product_rating
, база данных проверяет значение столбца user_id
, и если значение, отличное от NULL, не ссылается на строку в user
, возникает ошибка.
Обратите внимание, что ограничение внешнего ключа не приводит к автоматическому заполнению столбца user_id
. Если мы хотим установить связь со строкой в user
, мы должны предоставить значение для user_id
.