Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment utiliser DELETE ON CASCADE sur une relation plusieurs-à-un

ON DELETE CASCADE est un moyen de supprimer une ligne lorsqu'une ligne à laquelle elle fait référence est supprimée. Cela signifie :

  • Vous avez une ligne dans le tableau A
  • Vous avez une ligne dans le tableau B qui fait référence à une ligne dans le tableau A
  • Vous supprimez la ligne du tableau A
  • La base de données supprime la ligne correspondante dans le tableau B

Vous avez donc des éléments, et chaque élément appartient à une catégorie particulière. Dans votre tableau d'articles, vous avez un category_id (et veuillez corriger votre orthographe) qui fait référence à une ligne dans le tableau des catégories. Donc, dans votre situation :

  • Vous avez une catégorie
  • Vous avez un article qui fait référence à une catégorie
  • Vous supprimez une catégorie
  • La base de données supprime tous les éléments qui correspondent à cette catégorie

Ce que vous demandez est en quelque sorte l'inverse :

  • Vous avez des objets
  • Vous supprimez le dernier élément d'une catégorie particulière
  • La base de données trouve cette catégorie et la supprime

Il n'y a aucun moyen de faire cela avec ON DELETE CASCADE , pour deux raisons :

  1. Comment allez-vous créer une catégorie vide avant d'y insérer votre premier élément ? La base de données devrait le supprimer immédiatement.
  2. La base de données devrait faire beaucoup de travail supplémentaire en scannant la table. Il ne "sait" pas que l'article #23082 était le dernier article de la catégorie ; il faudrait d'une manière ou d'une autre garder une trace du nombre d'éléments dans la catégorie pour le faire.

Tout cela vient du fait que ON DELETE CASCADE est un moyen de maintenir l'intégrité référentielle . Autrement dit, c'est un moyen pour la base de données de vous donner une garantie solide que si vous voyez la catégorie #20393 sur l'article #9847, lorsque vous allez chercher la catégorie #20393 vous savez qu'elle existe . Ce n'est pas un dispositif d'économie de travail. :) C'est pourquoi les autres options sont ON DELETE SET NULL et ON DELETE RESTRICT  :ils garantissent également l'intégrité, mais au lieu de supprimer, ils suppriment la mauvaise référence ou empêchent la suppression d'origine de se produire.

La réponse est donc que vous devrez soit écrire une tâche cron pour nettoyer périodiquement cette table, soit utiliser une sorte de déclencheur ON DELETE, si vous vous inquiétez des catégories vides.