ON DELETE CASCADE
er en måde at slette en række på, når en række, den refererer til, slettes. Det betyder:
- Du har en række i tabel A
- Du har en række i tabel B, der refererer til en række i tabel A
- Du sletter rækken i tabel A
- Databasen sletter den tilsvarende række i tabel B
Så du har varer, og hver vare tilhører en bestemt kategori. I din varetabel har du et kategori_id (og ret venligst din stavning), der refererer til en række i kategoritabellen. Så i din situation:
- Du har en kategori
- Du har et element, der refererer til en kategori
- Du sletter en kategori
- Databasen sletter alle de elementer, der svarer til den kategori
Det, du beder om, er lidt omvendt:
- Du har varer
- Du sletter det sidste element i en bestemt kategori
- Databasen går hen og finder den kategori og sletter den
Der er ingen måde at gøre dette med ON DELETE CASCADE
, af to grunde:
- Hvordan vil du oprette en tom kategori, før du indsætter dit første element i den? Databasen skulle slette den med det samme.
- Databasen ville skulle gøre en masse ekstra arbejde med at scanne tabellen. Den "ved" ikke, at vare #23082 var den sidste vare i kategorien; det skulle på en eller anden måde være at holde styr på antallet af elementer i kategorien for at gøre det.
Alt dette stammer fra det faktum, at ON DELETE CASCADE
er en måde at vedligeholde referentiel integritet . Det vil sige, det er en måde for databasen at give dig en stærk garanti for, at hvis du ser kategori #20393 på vare #9847, når du går og kigger efter kategori #20393 ved du den eksisterer . Det er ikke en arbejdsbesparende enhed. :) Dette er grunden til, at de andre muligheder er ON DELETE SET NULL
og ON DELETE RESTRICT
:de garanterer også integritet, men i stedet for at slette fjerner de den dårlige reference eller forhindrer den oprindelige sletning i at finde sted.
Så svaret er, at du enten bliver nødt til at skrive et cron-job for med jævne mellemrum at rense den tabel eller bruge en form for ON DELETE-trigger, hvis du er bekymret for tomme kategorier.