MySQL ON DELETE CASCADE

Sammanfattning: I den här handledningen lär du dig hur du använder MySQL ON DELETE CASCADE referentiell åtgärd för en utländsk nyckel för att ta bort data från flera relaterade tabeller.

I föregående handledning lärde du dig hur du tar bort data från flera relaterade tabeller med hjälp av ett enda DELETE-meddelande. MySQL erbjuder dock ett effektivare sätt som kallas ON DELETE CASCADE referentiell åtgärd för en utländsk nyckel som gör att du kan radera data från underordnade tabeller automatiskt när du raderar data från den överordnade tabellen.

MySQL ON DELETE CASCADE exempel

Låt oss ta en titt på ett exempel på hur du kan använda MySQL ON DELETE CASCADE .

Antag att vi har två tabeller:buildings och rooms . I den här databasmodellen har varje byggnad ett eller flera rum. Varje rum tillhör dock endast en byggnad. Ett rum skulle inte existera utan en byggnad.

Relationen mellan tabellerna buildings och rooms är en till många (1:N) enligt följande databasdiagram:

När du raderar en rad från buildings-tabellen vill du också radera alla rader i rooms-tabellen som hänvisar till raden i buildings-tabellen. När du t.ex. raderar en rad med byggnadsnr. 2 i tabellen buildings enligt följande fråga:

Code language: SQL (Structured Query Language) (sql)

Du vill också att alla rader i tabellen rooms som hänvisar till byggnadsnummer 2 också ska tas bort.

Nedan följer steg som visar hur den referentiella åtgärden ON DELETE CASCADE fungerar.

Steg 1. Skapa tabellen buildings:

Code language: SQL (Structured Query Language) (sql)

Steg 2. Skapa tabellen rooms:

Code language: SQL (Structured Query Language) (sql)

Notera att ON DELETE CASCADE-klausulen finns i slutet av definitionen av den utländska nyckelbegränsningen.

Steg 3. Infoga rader i tabellen buildings:

Code language: SQL (Structured Query Language) (sql)

Steg 4. Fråga data från tabellen buildings:

Code language: SQL (Structured Query Language) (sql)

Vi har två rader i tabellen buildings.

Steg 5. Infoga rader i tabellen rooms:

Code language: SQL (Structured Query Language) (sql)

Steg 6. Fråga data från tabellen rooms:

Code language: SQL (Structured Query Language) (sql)

Vi har tre rum som tillhör byggnad nr 1 och två rum som tillhör byggnad nr 2.

Steg 7. Ta bort byggnaden med byggnadsnr. 2:

Code language: SQL (Structured Query Language) (sql)

Steg 8. Fråga data från tabellen rooms:

Code language: SQL (Structured Query Language) (sql)

Som du kan se har alla rader som hänvisar till building_no 2 raderats automatiskt.

Observera att ON DELETE CASCADE endast fungerar med tabeller med lagringsmotorer som stöder främmande nycklar, t.ex, InnoDB.

Vissa tabelltyper har inte stöd för utländska nycklar, t.ex. MyISAM, så du bör välja lämpliga lagringsmotorer för de tabeller som du planerar att använda MySQL ON DELETE CASCADE referentiell åtgärd.

Tips för att hitta tabeller som påverkas av MySQL ON DELETE CASCADE-åtgärden

Under vissa omständigheter är det användbart att veta vilken tabell som påverkas av ON DELETE CASCADE referentiell åtgärd när du tar bort data från en tabell. Du kan fråga efter dessa data från referential_constraints i information_schema-databasen på följande sätt:

Code language: SQL (Structured Query Language) (sql)

För att hitta tabeller som är associerade med buildings-tabellen med CASCADE-släckningsregeln i classicmodels-databasen använder du till exempel följande fråga:

Code language: SQL (Structured Query Language) (sql)

Lämna ett svar

Din e-postadress kommer inte publiceras.