MySQL ON DELETE CASCADE
Podsumowanie: W tym poradniku dowiesz się, jak używać MySQL ON DELETE CASCADE
akcji referencji dla klucza obcego do usuwania danych z wielu powiązanych tabel.
W poprzednim poradniku dowiedziałeś się, jak usunąć dane z wielu powiązanych tabel za pomocą pojedynczej instrukcji DELETE
. Jednak MySQL zapewnia bardziej efektywny sposób zwany ON DELETE CASCADE
działaniem referencyjnym dla klucza obcego, który pozwala na automatyczne usuwanie danych z tabel podrzędnych podczas usuwania danych z tabeli nadrzędnej.
MySQL ON DELETE CASCADE przykład
Przyjrzyjrzyjmy się przykładowi użycia MySQL ON DELETE CASCADE
.
Załóżmy, że mamy dwie tabele:buildings
i rooms
. W tym modelu bazy danych, każdy budynek ma jeden lub wiele pokoi. Jednak każdy pokój należy tylko do jednego budynku. Pokój nie istniałby bez budynku.
Związek między tabelami buildings
i rooms
jest jeden do wielu (1:N), jak pokazano na następującym schemacie bazy danych:
Gdy usuwasz wiersz z tabeli buildings
, chcesz również usunąć wszystkie wiersze w tabeli rooms
, które odwołują się do wiersza w tabeli buildings
. Na przykład po usunięciu wiersza z numerem budynku. 2 w tabeli buildings
zgodnie z następującym zapytaniem:
Code language: SQL (Structured Query Language) (sql)
Chcesz również, aby wiersze w tabeli rooms
, które odwołują się do budynku nr 2, również zostały usunięte.
Następujące kroki demonstrują sposób działania akcji referencyjnej ON DELETE CASCADE
.
Krok 1. Utwórz tabelę buildings
:
Code language: SQL (Structured Query Language) (sql)
Krok 2. Utwórz tabelę rooms
:
Code language: SQL (Structured Query Language) (sql)
Zauważ, że klauzula ON DELETE CASCADE
na końcu definicji ograniczenia klucza obcego.
Krok 3. Wstaw wiersze do tabeli buildings
:
Code language: SQL (Structured Query Language) (sql)
Krok 4. Wywołaj dane z tabeli buildings
:
Code language: SQL (Structured Query Language) (sql)
Mamy dwa wiersze w tabeli buildings
.
Krok 5. Wstaw wiersze do tabeli rooms
:
Code language: SQL (Structured Query Language) (sql)
Krok 6. Wywołaj dane z tabeli rooms
:
Code language: SQL (Structured Query Language) (sql)
Mamy trzy pokoje należące do budynku nr 1 i dwa pokoje należące do budynku nr 2.
Krok 7. Usuń budynek z budynkiem nr. 2:
Code language: SQL (Structured Query Language) (sql)
Krok 8. Wywołaj dane z tabeli rooms
:
Code language: SQL (Structured Query Language) (sql)
Jak widać, wszystkie wiersze odwołujące się do building_no
2 zostały automatycznie usunięte.
Zauważ, że ON DELETE CASCADE
działa tylko z tabelami z silnikami pamięci masowej obsługującymi klucze obce np, InnoDB.
Niektóre typy tabel nie obsługują kluczy obcych, takie jak MyISAM, więc powinieneś wybrać odpowiednie silniki przechowywania dla tabel, które planujesz użyć akcji referencji MySQL ON DELETE CASCADE
.
Wskazówki, aby znaleźć tabele dotknięte akcją MySQL ON DELETE CASCADE
Czasami warto wiedzieć, która tabela jest dotknięta akcją referencji ON DELETE CASCADE
, gdy usuwasz dane z tabeli. Możesz zapytać o te dane z referential_constraints
w bazie danych information_schema
w następujący sposób:
Code language: SQL (Structured Query Language) (sql)
Na przykład, aby znaleźć tabele, które są powiązane z tabelą buildings
z regułą usuwania CASCADE
w bazie danych classicmodels
, używasz następującego zapytania:
Code language: SQL (Structured Query Language) (sql)
.