Основы внешних ключей в MySQL?


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

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

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

4 87

4 ответа:

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 ' s.

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

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

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

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

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

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

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

1.Внешние ключи просто убедитесь, что ваши данные непротиворечивы.

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

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

запрос: Изменить стол ребенка добавить внешний ключ(ид_родительского_объекта) ссылается родитель(ID) на обновление каскада на удаление Каскад ;

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

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

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

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