Mysql
 sql >> Database >  >> RDS >> Mysql

Come utilizzare DELETE ON CASCADE su una relazione molti-a-uno

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:

  1. Come creerai una categoria vuota prima di inserire il tuo primo elemento in essa? Il database dovrebbe eliminarlo immediatamente.
  2. 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.