Myślę, że nie rozumiesz, co ON DELETE NO ACTION znaczy. nie oznacza pominięcie ograniczenia klucza obcego.
Po usunięciu rekordu, do którego odwołuje się klucz obcy, InnoDB ma możliwość podjęcia automatycznej akcji w celu naprawienia sytuacji:
- może
CASCADE, co oznacza, usuń rekord odsyłający. (To miałoby sens w przypadku czegoś takiego jakuser_address.user_id. Jeśli na stałe usuniesz użytkownika, prawdopodobnie chcesz również na stałe usunąć wszystkie adresy użytkownika.) - może
SET NULL, co oznacza, usuń klucz odsyłający. (Może to mieć sens w przypadku czegoś takiego jakfile.last_modified_by. Jeśli na stałe usuniesz użytkownika, możesz chcieć, aby ostatnia modyfikacja pliku stała się po prostu "nieznana".)
Jeśli określisz NO ACTION , mówisz InnoDB, że nie chcesz, aby wykonywała ona żadne z tych działań. Więc InnoDB nie może naprawić sytuacji za Ciebie; wszystko, co może zrobić, to odrzucić DELETE i zwróć błąd.
W rezultacie ON DELETE NO ACTION jest w rzeczywistości tym samym, co ON DELETE RESTRICT (domyślnie).
(Uwaga:w niektórych DBMS i w standardowym SQL, ON DELETE NO ACTION różni się nieco od ON DELETE RESTRICT :w tych, ON DELETE NO ACTION oznacza "zaakceptuj DELETE w ramach bieżącej transakcji, ale odrzuć całą transakcję, jeśli spróbuję ją zatwierdzić przed naprawieniem problemu”. Ale InnoDB nie obsługuje odroczonych kontroli, więc traktuje ON DELETE NO ACTION dokładnie tak samo jak ON DELETE RESTRICT i zawsze odrzuca DELETE natychmiast .)
Zobacz §§14.2.2.5 „KLUCZ OBCY Ograniczenia” i 13.1.17.2 "Korzystanie z ograniczeń KLUCZA OBCEGO w podręczniku MySQL 5.6 Reference Manual.