Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak używać DELETE ON CASCADE w relacji wiele do jednego?

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:

  1. Jak zamierzasz utworzyć pustą kategorię przed wstawieniem do niej pierwszego elementu? Baza danych musiałaby go natychmiast usunąć.
  2. 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sortowanie kolumny ciągów zawierającej liczby w SQL?

  2. Utwórz kolumnę przestrzenną MySQL — typ danych punktowych z długością szerokości geograficznej bez użycia tabeli Alter

  3. Zautomatyzowany sposób na konwersję plików XML do bazy danych SQL?

  4. Błąd ogólny:1005 Nie można utworzyć tabeli przy użyciu kompilacji schematu Laravel i kluczy obcych

  5. Umieścić bazę danych MySQL pod kontrolą wersji?