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.