sql >> Database teknologi >  >> RDS >> Mysql

Hvorfor bruge fremmednøgler uden handling ved sletning eller opdatering

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 som user_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 som file.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.



  1. Fremmednøgle til ikke-primær nøgle

  2. Hvordan kan jeg gemme og hente billeder fra en MySQL-database ved hjælp af PHP?

  3. Kan ikke oprette forbindelse til Postgres DB på grund af godkendelsestype 10 understøttes ikke

  4. Sådan opretter du en tabel med flere fremmednøgler og ikke bliver forvirret