Внешние ключи - временно обойти? - PullRequest
1 голос
/ 30 апреля 2010

Я только начал узнавать о плюсах внешних ключей в проектировании баз данных (mySQL / innoDB), и мне интересно, есть ли способ временно обойти внешний ключ при выполнении определенного запроса на удаление, просто удалить в родительской таблице а не из связанных дочерних таблиц.

Спасибо

Ответы [ 5 ]

6 голосов
/ 30 апреля 2010

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

2 голосов
/ 30 апреля 2010

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

Лично я никогда не нуждался в такой функциональности.

http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

1 голос
/ 01 мая 2010

ИНОСТРАННЫЕ КЛЮЧИ должны поддерживать постоянную базу данных. Поэтому против самой идеи внешних ключей хранить их в базе данных и разрешать удалять строки, на которые есть ссылки ...

Хотя ... есть один случай, когда временное нарушение этих ограничений может иметь смысл: во время транзакции. Важно обеспечить согласованность базы данных до и после транзакции и не позволять любому другому пользователю базы данных видеть противоречивые данные, но во время транзакции и только во время сеанса, выполняющего транзакцию, временное несоответствие не повредит. И SQL допускает это: вы можете определить некоторые внешние ключи (а иногда и другие ограничения) с отсрочкой и запросить отсрочку их принудительного исполнения до конца транзакции.

Таким образом, вы можете сделать сложный набор изменений в базе данных, даже удалив некоторые строки, по-прежнему ссылаясь на другие таблицы, и сохраняя согласованность базы данных и конец транзакции. Другие пользователи базы данных даже не увидят временное несоответствие.

Обновление: Кажется, MySQL не поддерживает отложенные ограничения. Так что этот ответ, вероятно, не очень полезен.

0 голосов
/ 30 апреля 2010

Редактировать: DISABLE KEYS не пропускает проверки внешнего ключа, только проверки уникального ключа.

Чтобы удалить ограничение внешнего ключа, используйте:

ALTER TABLE <tablename> DROP FOREIGN KEY <constraintname>;

Затем для восстановления ограничения необходимо повторно объявить ограничение внешнего ключа в другом операторе ALTER TABLE.

Подробнее см. http://dev.mysql.com/doc/refman/5.1/en/alter-table.html.

Но я согласен с @HLGEM и отвечаю +1. Тщательно продумайте, действительно ли вам это нужно. Большинство задач на самом деле проще , если вы сохраняете ограничения внешнего ключа.

Вы можете объявить свои внешние ключи с каскадными эффектами, чтобы установить значения дочерней таблицы в NULL или значение DEFAULT, чтобы можно было удалять родительские строки.

0 голосов
/ 30 апреля 2010

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

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