Мисля, че грешно разбирате какво 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
незабавно .)
Вижте §§14.2.2.5 "ВЪНШЕН КЛЮЧ Ограничения" и 13.1.17.2 "Използване на ограничения на FOREIGN KEY " в Справочното ръководство за MySQL 5.6.