MySQL, ограничение внешнего ключа не имеет никакого значения - PullRequest
1 голос
/ 12 февраля 2010

У меня есть база данных с несколькими таблицами. В «главной» таблице, называемой contacts, хранится информация о контактах, каждый из которых имеет id, имя и т. Д. *

У меня также есть 20 других таблиц, каждая из которых представляет определенную функцию, например staff, media ...

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

ALTER TABLE staff ADD contactsConstraint FOREIGN KEY (c_id) REFERENCES contacts(id) ON UPDATE CASCADE ON DELETE CASCADE.

Если я изменю строку в контактах, я также хочу, чтобы это изменение появилось в таблице персонала - и наоборот. Но ограничение, похоже, не имеет значения! Единственное, что он делает - выдает ошибку, если я пытаюсь добавить строку в staff, где значение c_id отсутствует в таблице contacts.

Что я сделал не так? Следует отметить, что я недавно изменил движок базы данных на InnoDB, чтобы быть уверенным, что мои ограничения будут работать.

Я также пытался удалить ON DELETE CASCADE, поэтому только обновления таблицы будут действовать в обеих таблицах, но также безрезультатно.

1 Ответ

2 голосов
/ 12 февраля 2010

Вы путаете разные понятия в своем вопросе. Если ваша база данных должным образом нормализована, изменение data в одной таблице никогда не должно иметь последствий в другой таблице. [*]

Если вы хотите изменить primary key и иметь записи ссылок в другой таблице follow, вы должны использовать ON UPDATE CASCADE.

ON UPDATE DELETE удаляет только ссылки ing записи, если вы DELETE ссылки ed записи. В вашем примере, если вы удалите запись из contacts, все записи в staff, ссылающиеся на удаленную запись, также будут удалены.

Для получения дополнительной информации прочтите Справочное руководство по MySQL о внешних ключах .

[*] Если у вас есть поле одинаковое в нескольких таблицах, содержащих одну и ту же информацию, у вас есть денормализованная схема, которая может быть хорошей для производительности, но требует от вас дополнительных усилий (вручную) обновлять все копии поля при его обновлении.

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