MySQL и внешние ключи - PullRequest
       28

MySQL и внешние ключи

1 голос
/ 17 ноября 2011

У меня вопрос по поводу внешних ключей в таблице InnoDB.У меня есть 4 таблицы в моей базе данных:

Регистрация:

  • UID - первичный ключ
  • Afid
  • Planid
  • Industryid

Филиалы:

  • Afid - первичный ключ

Планы:

  • Planid - первичный ключ

Отрасли:

  • Industryid - первичный ключ

SQL Я использую для добавления ключей:

CONSTRAINT `FK_signup_industries` FOREIGN KEY (`industryid`) REFERENCES `industries` (`industryid`) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT `FK_signup_affiliates` FOREIGN KEY (`afid`) REFERENCES `affiliates` (`afid`) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT `FK_signup_plans` FOREIGN KEY (`planid`) REFERENCES `plans` (`planid`) ON UPDATE CASCADE ON DELETE CASCADE

Мой вопрос:

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

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

CONSTRAINT `FK_signup_plans` FOREIGN KEY (`planid`) REFERENCES `plans` (`planid`) ON UPDATE CASCADE ON DELETE NO ACTION

я получаю эту ошибку:

Cannot delete a parent row.

1 Ответ

1 голос
/ 17 ноября 2011

Если вам нужно, чтобы строка в «Регистрации» оставалась, даже если вы удалили указанную строку в «Отрасли», «Филиалы» или «Планы», у вас есть два варианта:

  • Не объявлять иностранныйключевое ограничение.Это устраняет принудительное использование ссылочной целостности, но позволяет существовать в Зарегистрировании строки, ссылающиеся на значение родительского первичного ключа, которого больше не существует.

  • Использовать ON DELETE SET NULL.Это позволяет строке оставаться, но значение внешнего ключа, которое ссылается на теперь удаленного родителя, будет изменено. *

Подробнее см. http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

*Стандартная спецификация SQL также определяет правило ON DELETE SET DEFAULT, но InnoDB не поддерживает эту функцию.

...