W tym przykładzie możesz wykorzystać pseudo tabelę „usuniętą”. Coś jak:
begin transaction;
declare @deletedIds table ( id int );
delete from t1
output deleted.id into @deletedIds
from table1 as t1
inner join table2 as t2
on t2.id = t1.id
inner join table3 as t3
on t3.id = t2.id;
delete from t2
from table2 as t2
inner join @deletedIds as d
on d.id = t2.id;
delete from t3
from table3 as t3 ...
commit transaction;
Oczywiście możesz zrobić „wyjście usunięte”. przy drugim również usuń, jeśli potrzebujesz czegoś do przyłączenia się przy trzecim stole.
Na marginesie, można również wstawić. * W instrukcji wstawiania oraz wstawiać. * I usuwać. * W instrukcji aktualizacji.
EDYCJA:
Czy rozważałeś również dodanie wyzwalacza w tabeli 1 w celu usunięcia z tabeli 2 + 3? Będziesz wewnątrz niejawnej transakcji i będziesz mieć również dostępne pseudo-tabele „wstawione ” i „usunięte ”.
Zawsze możesz skonfigurować usuwanie kaskadowe w relacjach tabel.
Możesz hermetyzować wiele usunięć w jednej procedurze składowanej.
Możesz użyć transakcji, aby zapewnić jedną jednostkę pracy.
źródło
Możesz użyć składni JOIN w klauzuli FROM w DELETE w SQL Server, ale nadal usuwasz tylko z pierwszej tabeli i jest to zastrzeżone rozszerzenie Transact-SQL, które jest alternatywą dla zapytania podrzędnego.
Z przykładu tutaj :
źródło
Przykład usunięcia niektórych rekordów z tabeli głównej i odpowiednich rekordów z dwóch tabel szczegółowych:
źródło
SELECT INTO #DeleteIds
zamiastCREATE TABLE 'DeleteIds
poINSERT INTO 'DeleteIds...
?Zastanawiam się tylko… czy to naprawdę możliwe w MySQL? usunie t1 i t2? albo po prostu źle zrozumiałem pytanie.
Ale jeśli chcesz tylko usunąć tabelę table1 z wieloma warunkami łączenia, po prostu nie aliasuj tabeli, którą chcesz usunąć
to:
powinno być napisane w ten sposób, aby działało w MSSQL:
aby porównać, w jaki sposób dwa inne popularne RDBMS wykonują operację usuwania:
http://mssql-to-postgresql.blogspot.com/2007/12/deleting-duplicates-in-postgresql-ms.html
źródło
Zasadniczo nie, musisz zrobić trzy oświadczenia o usunięciu w transakcji, najpierw dzieci, a potem rodzice. Konfiguracja usuwania kaskadowego jest dobrym pomysłem, jeśli nie jest to jednorazowa rzecz, a jej istnienie nie będzie kolidować z żadną istniejącą konfiguracją wyzwalacza.
źródło
Na serwerze SQL nie ma możliwości usunięcia wielu tabel za pomocą łączenia. Więc musisz najpierw usunąć dziecko przed usunięciem rodzica formularza.
źródło
Jest to alternatywny sposób usuwania rekordów bez pozostawiania sierot.
źródło
Wszystko zostało wskazane. Po prostu użyj
DELETE ON CASCADE
na rodzicutable
lub usuń zchild-table
doparent
.źródło
Jak już wskazał Aaron, możesz ustawić zachowanie usuwania na CASCADE, co spowoduje usunięcie rekordów podrzędnych, gdy rekord nadrzędny zostanie usunięty. O ile nie chcesz, aby wydarzyła się jakaś inna magia (w takim przypadku przydatne byłyby punkty 2 i 3 odpowiedzi Aarona), nie rozumiem, dlaczego miałbyś usuwać za pomocą złączeń wewnętrznych.
źródło
Aby oprzeć się na odpowiedzi Johna Gibba, aby usunąć zestaw danych w dwóch tabelach z relacją FK:
źródło
źródło
$ sql = "DELETE FROM
basic_tbl
,education_tbl
,personal_tbl
,address_tbl
,department_tbl
UŻYWANIEbasic_tbl
,education_tbl
,personal_tbl
,address_tbl
,department_tbl
GDZIEb_id
=e_id
=p_id
=a_id
=d_id
="" $ id.."”„; $ rs = mysqli_query ($ con, $ sql);źródło