Jeg tror, du misforstår hvad ON DELETE NO ACTION
midler. Det gør ikke betyder at undertrykke fremmednøgle-begrænsningen.
Når du sletter en post, der henvises til af en fremmednøgle, har InnoDB mulighed for at foretage en automatisk handling for at rette op på situationen:
- det kan
CASCADE
, hvilket betyder, at slette den henvisende post. (Dette ville give mening for noget somuser_address.user_id
. Hvis du hårdsletter en bruger, vil du sandsynligvis også hårdslette alle brugerens adresser.) - den kan
SET NULL
, hvilket betyder, ryd den henvisende nøgle ud. (Dette kan give mening for noget somfile.last_modified_by
. Hvis du hårdt sletter en bruger, vil du måske have, at filens sidst ændrede af simpelthen bliver "ukendt".)
Hvis du angiver NO ACTION
, fortæller du InnoDB, at du ikke ønsker, at den skal udføre nogen af disse handlinger. Så InnoDB kan ikke ordne situationen for dig; alt det kan gøre er at afvise DELETE
og returnerer en fejl.
Som et resultat, ON DELETE NO ACTION
er faktisk det samme som ON DELETE RESTRICT
(standard).
(Bemærk:i nogle DBMS'er og i standard SQL, ON DELETE NO ACTION
er en smule anderledes end ON DELETE RESTRICT
:i disse, ON DELETE NO ACTION
betyder "accepter DELETE
inden for den aktuelle transaktion, men afvis hele transaktionen, hvis jeg forsøger at udføre den, før jeg afhjælper problemet". Men InnoDB understøtter ikke udskudte checks, så det behandler ON DELETE NO ACTION
nøjagtig det samme som ON DELETE RESTRICT
, og afviser altid DELETE
straks .)
Se §§14.2.2.5 "FREIGN KEY Begrænsninger" og 13.1.17.2 "Brug af UDENLANDSKE NØGLE-begrænsninger " i MySQL 5.6 Reference Manual.