Основы иностранных ключей в MySQL? - PullRequest
88 голосов
/ 16 апреля 2009

Есть ли хорошее объяснение того, как использовать конструкцию внешнего ключа MySQL?

Я не совсем понял это из самих документов MySQL. До сих пор я занимался такими вещами, как внешние ключи, с помощью объединений и программного кода.

И вторая часть вопроса, есть ли какие-либо улучшения, которые должны быть сделаны с помощью встроенных внешних ключей MySQL?

Ответы [ 4 ]

115 голосов
/ 16 апреля 2009

FOREIGN KEYS просто убедитесь, что ваши данные соответствуют.

Они не улучшают запросы в смысле эффективности, они просто делают неправильные запросы неудачными.

Если у вас такие отношения:

CREATE TABLE department (id INT NOT NULL)
CREATE TABLE employee (id INT NOT NULL, dept_id INT NOT NULL, FOREIGN KEY (dept_id) REFERENCES department(id))

, тогда вы не можете удалить department, если у него есть employee.

Если вы введете ON DELETE CASCADE для определения FOREIGN KEY, ссылочные строки будут автоматически удалены вместе со ссылочными.

Как ограничение, FOREIGN KEY на самом деле немного замедляет запросы.

Дополнительная проверка должна выполняться при удалении из ссылочной таблицы или вставке в ссылочную таблицу.

31 голосов
/ 16 апреля 2009

Основными преимуществами использования реальных внешних ключей являются обеспечение целостности данных и возможность настройки каскадных действий для связанных элементов при изменении или удалении чего-либо.

Например, представьте, что вы программируете форум. У вас есть таблица «тем» с первичным ключом topics.topic_id, и у вас есть таблица «сообщений», где сообщения прикрепляются к темам со столбцом posts.topic_id, который является внешним ключом таблицы тем.

Это отношение внешнего ключа гарантирует, что каждое сообщение прикреплено к действующей теме. Если у вашей единственной темы есть ID # 1, в базе данных, прикрепленной к теме № 2, не может быть поста. База данных обеспечивает это.

Для каскадного преимущества вы можете настроить его так, чтобы при удалении темы из таблицы тем база данных автоматически удаляла все сообщения в таблице сообщений, которые были прикреплены к этой теме. Это хорошо, потому что он удаляет шаг, который вы должны помнить, чтобы сделать вручную, который может быть довольно сложным, когда у вас есть много связанных таблиц. С внешними ключами все отношения могут быть очищены автоматически.

11 голосов
/ 10 сентября 2015

1. КЛЮЧИ ИГРЫ просто убедитесь, что ваши данные согласованы.

2. Если мы применим каскад удаления к определению внешнего ключа, ссылка на строку будет удалена автоматически при удалении родительской строки.

3. Если мы применим Каскад обновления к определению внешнего ключа, дочерняя строка будет обновляться автоматически при обновлении родительской строки.

Запрос: ALTER TABLE child ADD FOREIGN KEY (parent_id) ССЫЛКИ parent (id) НА ОБНОВЛЕНИИ КАСКАД НА УДАЛИТЬ КАСКАД;

  1. Вы не можете удалить прямую родительскую таблицу, сначала удалите внешний ключ из дочерней таблицы, чем удалить родительскую таблицу.
6 голосов
/ 16 апреля 2009

Основным преимуществом является то, что вы можете ограничить, какие значения вы можете ввести в таблицу; если вы попытаетесь ввести значение, которого нет в указанной таблице, вы не сможете это сделать.

Кроме того, если вы обновляете или удаляете значение в ссылочной таблице, вы можете настроить его на автоматическое обновление или удаление каскадом любой строки, содержащей это значение.

Это действительно отличная функция, использующая ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...