ON DELETE CASCADE
è un modo per eliminare una riga quando viene eliminata una riga a cui fa riferimento. Ciò significa:
- Hai una riga nella tabella A
- Hai una riga nella tabella B che fa riferimento a una riga nella tabella A
- Cancella la riga nella tabella A
- Il database elimina la riga corrispondente nella tabella B
Quindi hai articoli e ogni articolo appartiene a una categoria particolare. Nella tabella degli articoli, hai un category_id (e correggi l'ortografia) che fa riferimento a una riga nella tabella delle categorie. Quindi, nella tua situazione:
- Hai una categoria
- Hai un elemento che fa riferimento a una categoria
- Elimini una categoria
- Il database elimina tutti gli elementi che corrispondono a quella categoria
Quello che stai chiedendo è più o meno il contrario:
- Hai degli oggetti
- Elimini l'ultimo elemento in una particolare categoria
- Il database va e trova quella categoria e la elimina
Non c'è modo di farlo con ON DELETE CASCADE
, per due motivi:
- Come creerai una categoria vuota prima di inserire il tuo primo elemento in essa? Il database dovrebbe eliminarlo immediatamente.
- Il database dovrebbe fare molto lavoro extra per la scansione della tabella. Non "sa" che l'articolo #23082 fosse l'ultimo nella categoria; dovrebbe in qualche modo tenere traccia del numero di elementi nella categoria per farlo.
Tutto questo deriva dal fatto che ON DELETE CASCADE
è un modo per mantenere l'integrità referenziale . Cioè, è un modo per il database di darti una forte garanzia che se vedi la categoria #20393 sull'articolo #9847, quando vai a cercare la categoria #20393 sai che esiste . non un dispositivo per risparmiare manodopera. :) Questo è il motivo per cui le altre opzioni sono ON DELETE SET NULL
e ON DELETE RESTRICT
:garantiscono anche l'integrità, ma invece di eliminare, rimuovono il riferimento errato o impediscono l'eliminazione originale.
Quindi la risposta è che dovrai scrivere un cron job per pulire periodicamente quella tabella o usare una sorta di trigger ON DELETE, se sei preoccupato per le categorie vuote.