Основы иностранных ключей в MySQL?
Есть ли хорошее объяснение того, как использовать конструкцию внешнего ключа MySQL?
Я не совсем понял это из самих документов MySQL. До сих пор я занимался такими вещами, как внешние ключи, с помощью объединений и программного кода.
И вторая часть вопроса, есть ли какие-либо улучшения, которые будут сделаны с использованием встроенных внешних ключей MySQL?
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
, который является внешним ключом к таблице тем.
Это отношение внешнего ключа гарантирует, что каждое сообщение прикреплено к действующей теме. Если у вашей единственной темы есть ID #1, в базе данных, прикрепленной к теме № 2, не может быть поста. База данных обеспечивает это.
Для каскадного преимущества вы можете настроить его так, чтобы при удалении темы из таблицы тем база данных автоматически удаляла все сообщения в таблице сообщений, которые были прикреплены к этой теме. Это хорошо, потому что он удаляет шаг, который вы должны помнить, чтобы выполнить вручную, который может быть довольно сложным, когда у вас есть много связанных таблиц. С внешними ключами все отношения могут быть очищены автоматически.
1. КЛЮЧИ ИГРЫ просто убедитесь, что ваши данные согласованы.
2. Если мы применяем каскад удаления к определению внешнего ключа, ссылка на строку будет удаляться автоматически при удалении родительской строки.
3. Если мы применим Каскад обновления к определению внешнего ключа, дочерняя строка будет обновляться автоматически при обновлении родительской строки.
Запрос: ALTER TABLE child ADD FOREIGN KEY (parent_id) ССЫЛКИ parent(id) ПО ОБНОВЛЕНИЮ КАСКАД ПО УДАЛЕНИЮ КАСКАД;
- Вы не можете удалить прямую родительскую таблицу, сначала удалите внешний ключ из дочерней таблицы, затем удалите родительскую таблицу.
Основным преимуществом является то, что вы можете ограничить, какие значения вы можете ввести в таблицу; Если вы попытаетесь ввести значение, которого нет в ссылочной таблице, вы не сможете это сделать.
Кроме того, если вы обновляете или удаляете значение в ссылочной таблице, вы можете настроить его на автоматическое обновление или удаление каскадом любой строки, содержащей это значение.
Это действительно отличная функция, использующая ваш код.