Что такое внешние ключи MySQL?
В ответ на Qaru я увидел этот код:
CREATE TABLE Favorites (
user_id INT NOT NULL,
movie_id INT NOT NULL,
PRIMARY KEY (user_id, movie_id),
FOREIGN KEY (user_id) REFERENCES Users(user_id),
FOREIGN KEY (movie_id) REFERENCES Movies(movie_id)
);
Я никогда раньше не использовал ключевое слово отношения внешнего ключа.
- Что это такое?
- Почему люди используют его?
- Предоставляет ли он какую-либо пользу помимо семантики?
Ответы
Ответ 1
Внешний ключ - это ссылка на первичный ключ в другой таблице или самой таблице. Он используется для так называемой ссылочной целостности. В принципе, в вашей таблице, для записи, которая будет вставлена в Favorites
, вам нужно будет указать действительный user_id
из таблицы Users
и допустимый movie_id
из таблицы Movies
. При использовании внешних ключей я не могу удалить запись из Users
или Movies
. Если бы у меня не было внешних ключей, я мог бы удалить эти записи. Тогда, если бы я сделал SELECT ... JOIN
на Favorites
, он сломался.
См. Wikipedia.
Ответ 2
Внешний ключ описывает взаимосвязь между двумя таблицами. Он имеет много преимуществ:
- Вы можете обеспечить, чтобы, если значение находится в одной таблице, оно также должно существовать в другой таблице. Любая попытка прервать это ограничение приведет к ошибке.
- Это позволяет администраторам баз данных или программистам легче понять взаимосвязь между таблицами, просто взглянув на определения таблиц.
- Он позволяет инструментам проверять схему и рисовать диаграммы, показывающие отношения между таблицами, или создавать классы, в которых дети объекта доступны из родителя через члены.
- В InnoDB добавление внешнего ключа также автоматически добавляет индекс в этот столбец, чтобы соединение можно было эффективно выполнять в любом направлении. (Источник)
Если вы используете MyISAM, тогда внешние ключи не поддерживаются.
Ответ 3
Вы также можете добавить возможность каскадирования при удалении связанной записи. Например, если у меня есть таблица библиотек со многими книгами в связанной книге "book", и я удаляю данную библиотеку из моей таблицы библиотек, ее "зависимые книжные записи" также будут удалены.