Подтвердить что ты не робот

Зачем использовать внешние ключи без каких-либо действий при удалении или обновлении

У меня есть вопрос, представляющий интерес:

У меня есть 2 таблицы в с помощью InnoDb.
table tbl_a имеет первичный ключ с именем a_id;
таблица tbl_b имеет первичный b_id и внешний ключ на tbl_a.a_id с "ON DELETE NO ACTION".

+-------------+---------------+---------------+
|  Table Name |  Primary Key  |  Foreign Key  |
+-------------+---------------+---------------+
|    tbl_a    |     a_id      |               |
|    tbl_b    |     b_id      |     a_id      |
+-------------+---------------+---------------+

почему я должен использовать InnoDb и внешние ключи, если я вообще не использую магию внешних ключей?

Есть еще точка использования и внешние ключи
вместо и никаких внешних ключей.
Если я просто делаю "NO ACTION" при удалении или обновлении?

Надеюсь, вы получили мою точку зрения:)

4b9b3361

Ответ 1

Я думаю, вы не понимаете, что означает ON DELETE NO ACTION. Это не означает подавление ограничения внешнего ключа.

Когда вы удаляете запись, на которую ссылается внешний ключ, InnoDB имеет возможность предпринять автоматическое действие для исправления ситуации:

  • он может CASCADE, что означает, удалите ссылочную запись. (Это имеет смысл для чего-то вроде user_address.user_id. Если вы сильно удаляете пользователя, вы, вероятно, захотите также удалить все пользовательские адреса.)
  • он может SET NULL, то есть очистить ссылочный ключ. (Это может иметь смысл для чего-то вроде file.last_modified_by. Если вы сильно удаляете пользователя, вы можете захотеть, чтобы файл с последними изменениями стал просто "неизвестным".)

Если вы укажете NO ACTION, вы сообщаете InnoDB, что вы не хотите, чтобы он выполнял одно из этих действий. Поэтому InnoDB не может исправить ситуацию для вас; все, что он может сделать, это отклонить DELETE и вернуть ошибку.

В результате ON DELETE NO ACTION на самом деле совпадает с ON DELETE RESTRICT (по умолчанию).

(Примечание: в некоторых СУБД и в стандартном SQL ON DELETE NO ACTION немного отличается от ON DELETE RESTRICT: в них ON DELETE NO ACTION означает "принять DELETE в текущей транзакции, но отклонить всю транзакцию если я попытаюсь выполнить его, прежде чем исправлять проблему". Но InnoDB не поддерживает отложенные проверки, поэтому он обрабатывает ON DELETE NO ACTION точно так же, как ON DELETE RESTRICT, и всегда отклоняет DELETE немедленно.)

См. & sect; & sect; 14.2.2.5 "Ограничения FOREIGN KEY" и 13.1.17.2 "Использование ограничений FOREIGN KEY" в Справочном руководстве MySQL 5.6.

Ответ 2

Ограничение внешнего ключа, даже без ON DELETE / UPDATE CASCADE, гарантирует, что если вы вставляете значение в дочернюю таблицу, то оно имеет правильное совпадающее значение в родительской таблице (или равно NULL, если столбец FK имеет значение NULL). Попытка вставить недопустимое значение в столбец FK дочерней таблицы приведет к ошибке при сбое ограничения, поэтому защита данных будет защищена.

ОШИБКА 1452 (23000): невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа завершается неудачно

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

ON DELETE NO ACTION (то же самое, что и оговорка ON DELETE) будет активно предотвращать удаление родительской строки, если на нее ссылается любая дочерняя таблица, а не пассивно разрешать ее удалять, не затрагивая дочерние строки.