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.