Ik denk dat je niet begrijpt wat ON DELETE NO ACTION
middelen. Het doet niet bedoel om de externe-sleutelbeperking te onderdrukken.
Wanneer u een record verwijdert waarnaar wordt verwezen met een externe sleutel, heeft InnoDB de mogelijkheid om een automatische actie te ondernemen om de situatie te corrigeren:
- het kan
CASCADE
, wat betekent:verwijder het verwijzende record. (Dit zou logisch zijn voor iets alsuser_address.user_id
. Als u een gebruiker definitief verwijdert, wilt u waarschijnlijk ook alle adressen van de gebruiker definitief verwijderen.) - het kan
SET NULL
, wat betekent:verwijder de verwijzende sleutel. (Dit kan logisch zijn voor iets alsfile.last_modified_by
. Als u een gebruiker definitief verwijdert, wilt u misschien dat de laatste wijziging van het bestand gewoon "onbekend" wordt.)
Als u NO ACTION
opgeeft , vertel je InnoDB dat je niet wilt dat het een van deze acties onderneemt. Dus InnoDB kan de situatie niet voor je oplossen; het enige wat het kan doen is de DELETE
. weigeren en een fout terugsturen.
Dientengevolge, ON DELETE NO ACTION
is eigenlijk hetzelfde als ON DELETE RESTRICT
(de standaard).
(Opmerking:in sommige DBMS-en, en in standaard SQL, ON DELETE NO ACTION
is een beetje anders dan ON DELETE RESTRICT
:in die, ON DELETE NO ACTION
betekent "accepteer de DELETE
binnen de huidige transactie, maar weiger de hele transactie als ik probeer deze vast te leggen voordat ik het probleem verhelp". Maar InnoDB ondersteunt geen uitgestelde controles, dus behandelt het ON DELETE NO ACTION
precies hetzelfde als ON DELETE RESTRICT
, en verwerpt altijd de DELETE
onmiddellijk .)
Zie §§14.2.2.5 "BUITENLANDSE SLEUTEL beperkingen" en 13.1.17.2 "BUITENLANDSE KEY-beperkingen gebruiken " in de MySQL 5.6 Referentiehandleiding.