Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So verwenden Sie DELETE ON CASCADE bei einer Viele-zu-Eins-Beziehung

ON DELETE CASCADE ist eine Möglichkeit, eine Zeile zu löschen, wenn eine Zeile, auf die sie verweist, gelöscht wird. Das bedeutet:

  • Sie haben eine Zeile in Tabelle A
  • Sie haben eine Zeile in Tabelle B, die auf eine Zeile in Tabelle A verweist
  • Sie löschen die Zeile in Tabelle A
  • Die Datenbank löscht die entsprechende Zeile in Tabelle B

Sie haben also Artikel, und jeder Artikel gehört zu einer bestimmten Kategorie. In Ihrer Artikeltabelle haben Sie eine category_id (und korrigieren Sie bitte Ihre Schreibweise), die sich auf eine Zeile in der Kategorientabelle bezieht. Also, in Ihrer Situation:

  • Du hast eine Kategorie
  • Sie haben einen Artikel, der auf eine Kategorie verweist
  • Du löschst eine Kategorie
  • Die Datenbank löscht alle Artikel, die dieser Kategorie entsprechen

Was Sie verlangen, ist genau umgekehrt:

  • Du hast Gegenstände
  • Sie löschen das letzte Element in einer bestimmten Kategorie
  • Die Datenbank findet diese Kategorie und löscht sie

Mit ON DELETE CASCADE ist dies nicht möglich , aus zwei Gründen:

  1. Wie erstellen Sie eine leere Kategorie, bevor Sie Ihr erstes Element darin einfügen? Die Datenbank müsste es sofort löschen.
  2. Die Datenbank müsste viel zusätzliche Arbeit leisten, um die Tabelle zu scannen. Es „weiß“ nicht, dass Artikel Nr. 23082 der letzte Artikel in der Kategorie war; es müsste irgendwie die Anzahl der Artikel in der Kategorie verfolgen, um das zu tun.

Dies alles ergibt sich aus der Tatsache, dass ON DELETE CASCADE ist eine Möglichkeit, die referenzielle Integrität aufrechtzuerhalten . Das heißt, es ist eine Möglichkeit für die Datenbank, Ihnen eine starke Garantie zu geben, dass, wenn Sie die Kategorie Nr. 20393 auf Artikel Nr. 9847 sehen, wenn Sie nach Kategorie Nr. 20393 suchen, Sie wissen, dass sie existiert . Es ist nicht ein arbeitssparendes Gerät. :) Deshalb sind die anderen Optionen ON DELETE SET NULL und ON DELETE RESTRICT :Sie garantieren auch die Integrität, aber anstatt sie zu löschen, entfernen sie die fehlerhafte Referenz oder verhindern, dass die ursprüngliche Löschung erfolgt.

Die Antwort lautet also, Sie müssen entweder einen Cron-Job schreiben, um diese Tabelle regelmäßig zu bereinigen, oder eine Art ON DELETE-Trigger verwenden, wenn Sie sich Sorgen um leere Kategorien machen.