Verwendung von DELETE ON CASCADE in einer Viele-zu-Eins-Beziehung

9

Darf mir jemand helfen? Ich versuche etwas, aber ich bin (zu) neu zu (meinem) SQL.

Ich verwende zwei Tabellen: Elemente und Kategorien. Tabellenelemente haben ein Feld mit Fremdschlüssel: category_id.

Ich möchte, dass die Tabelle Kategorien sauber gehalten wird. Wenn also in den Kategorien kein Element der Kategorie X enthalten ist, sollte die Kategorie X aus den Kategorien gelöscht werden. Wie stellen Sie das fest? Ich vermutete mit DELETE ON CASCADE, aber bis jetzt löschte es nur die entsprechenden Elemente von Items, wenn ich eine Kategorie aus Kategorien löschte.

Vielen Dank, dass Sie mir geholfen haben!

    
Bart Weber 03.09.2011, 07:26
quelle

1 Antwort

37

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 der 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 Gegenstände und jeder Gegenstand gehört zu einer bestimmten Kategorie. In Ihrer Artikeltabelle haben Sie eine Kategorie-ID (und korrigieren Sie bitte Ihre Schreibweise), die auf eine Zeile in der Kategorietabelle verweist. Also, in deiner Situation:

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

Was Sie fragen, ist etwas anders herum:

  • Sie haben Artikel
  • Sie löschen das letzte Element in einer bestimmten Kategorie
  • Die Datenbank geht und findet diese Kategorie und löscht sie

Es gibt keine Möglichkeit, dies mit ON DELETE CASCADE zu tun, aus zwei Gründen:

  1. Wie werden Sie eine leere Kategorie erstellen, bevor Sie Ihren ersten Artikel einfügen? Die Datenbank müsste sie sofort löschen.
  2. Die Datenbank müsste beim Scannen der Tabelle eine Menge zusätzlicher Arbeit erledigen. Es "weiß" nicht, dass Element 23082 das letzte Element in der Kategorie war; es müsste irgendwie die Anzahl der Gegenstände in der Kategorie verfolgen, um das zu tun.

Dies alles ergibt sich aus der Tatsache, dass ON DELETE CASCADE eine Methode ist, die referentielle Integrität beizubehalten . Das heißt, es ist eine Möglichkeit für die Datenbank, Ihnen eine starke Garantie zu geben, dass wenn Sie Kategorie # 20393 auf Element # 9847 sehen, wenn Sie nach Kategorie # 20393 suchen Sie wissen, dass es existiert . Es ist nicht ein arbeitssparendes Gerät. :) Das ist der Grund, warum die anderen Optionen ON DELETE SET NULL und ON DELETE RESTRICT sind: Sie garantieren auch die Integrität, aber anstatt zu löschen, entfernen sie den schlechten Verweis oder verhindern, dass das ursprüngliche Löschen auftritt.

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

    
Daniel Lyons 03.09.2011, 07:38
quelle

Tags und Links