ON DELETE CASCADE
to sposób na usunięcie wiersza, gdy wiersz, do którego się odwołuje, zostanie usunięty. Oznacza to:
- Masz wiersz w tabeli A
- Masz wiersz w tabeli B, który odwołuje się do wiersza w tabeli A
- Usuwasz wiersz w tabeli A
- Baza danych usuwa odpowiedni wiersz w tabeli B
Masz więc przedmioty, a każdy przedmiot należy do określonej kategorii. W tabeli przedmiotów masz identyfikator kategorii (popraw pisownię), który odnosi się do wiersza w tabeli kategorii. Tak więc w twojej sytuacji:
- Masz kategorię
- Masz przedmiot, który odwołuje się do kategorii
- Usuwasz kategorię
- Baza danych usuwa wszystkie elementy odpowiadające tej kategorii
To, o co prosisz, jest na odwrót:
- Masz przedmioty
- Usuwasz ostatni element w określonej kategorii
- Baza danych przechodzi i znajduje tę kategorię i usuwa ją
Nie można tego zrobić za pomocą ON DELETE CASCADE
, z dwóch powodów:
- Jak zamierzasz utworzyć pustą kategorię przed wstawieniem do niej pierwszego elementu? Baza danych musiałaby go natychmiast usunąć.
- Baza danych musiałaby wykonać dużo dodatkowej pracy przy skanowaniu tabeli. Nie "wie", że pozycja #23082 była ostatnią pozycją w kategorii; musiałby jakoś śledzić liczbę przedmiotów w kategorii, aby to zrobić.
Wszystko to wynika z faktu, że ON DELETE CASCADE
jest sposobem zachowania integralności referencyjnej . Oznacza to, że baza danych daje ci silną gwarancję, że jeśli zobaczysz kategorię #20393 w pozycji #9847, kiedy szukasz kategorii #20393 wiesz, że istnieje . To nie urządzenie oszczędzające pracę. :) Dlatego inne opcje to ON DELETE SET NULL
i ON DELETE RESTRICT
:gwarantują również integralność, ale zamiast usuwać, usuwają złe odniesienie lub zapobiegają wystąpieniu oryginalnego usunięcia.
Odpowiedź brzmi:będziesz musiał albo napisać zadanie cron, aby okresowo czyścić tę tabelę, albo użyć jakiegoś wyzwalacza ON DELETE, jeśli martwisz się pustymi kategoriami.