Jag tror att du missförstår vad ON DELETE NO ACTION
betyder att. Det gör det inte innebär att undertrycka begränsningen av främmande nyckel.
När du raderar en post som hänvisas till av en främmande nyckel, har InnoDB möjlighet att vidta en automatisk åtgärd för att rätta till situationen:
- den kan
CASCADE
, vilket betyder, radera den refererande posten. (Detta skulle vara vettigt för något somuser_address.user_id
. Om du hårdraderar en användare vill du förmodligen också hårdradera alla användarens adresser.) - den kan
SET NULL
, vilket betyder, rensa bort hänvisningsnyckeln. (Detta kan vara vettigt för något somfile.last_modified_by
. Om du hårdraderar en användare kanske du vill att filens senast ändrade av helt enkelt blir "okänd".)
Om du anger NO ACTION
, säger du till InnoDB att du inte vill att den ska utföra någon av dessa åtgärder. Så InnoDB kan inte fixa situationen åt dig; allt den kan göra är att avvisa DELETE
och returnera ett fel.
Som ett resultat, ON DELETE NO ACTION
är faktiskt detsamma som ON DELETE RESTRICT
(standard).
(Obs:i vissa DBMS:er och i standard SQL, ON DELETE NO ACTION
är lite annorlunda än ON DELETE RESTRICT
:i dessa, ON DELETE NO ACTION
betyder "acceptera DELETE
inom den aktuella transaktionen, men avvisa hela transaktionen om jag försöker utföra den innan jag åtgärdar problemet". Men InnoDB stöder inte uppskjutna kontroller, så det behandlar ON DELETE NO ACTION
exakt samma som ON DELETE RESTRICT
, och avvisar alltid DELETE
omedelbart .)
Se §§14.2.2.5 "FOREIGN KEY Begränsningar" och 13.1.17.2 "Använda begränsningar av utländsk nyckel " i MySQL 5.6 Reference Manual.