sql >> Databasteknik >  >> RDS >> Mysql

Varför använda främmande nycklar utan åtgärd vid radering eller uppdatering

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



  1. Olika tidszonstyper på DateTime-objektet

  2. Är det dålig design att använda arrayer i en databas?

  3. Uppdatera mysql-tabellen med data från en annan tabell

  4. MySQL:välj 5 rader före och efter specifik rad