Что такое внешние ключи 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", и я удаляю данную библиотеку из моей таблицы библиотек, ее "зависимые книжные записи" также будут удалены.