Oto skrypt do tworzenia moich tabel:
CREATE TABLE clients (
client_i INT(11),
PRIMARY KEY (client_id)
);
CREATE TABLE projects (
project_id INT(11) UNSIGNED,
client_id INT(11) UNSIGNED,
PRIMARY KEY (project_id)
);
CREATE TABLE posts (
post_id INT(11) UNSIGNED,
project_id INT(11) UNSIGNED,
PRIMARY KEY (post_id)
);
W moim kodzie PHP, usuwając klienta, chcę usunąć wszystkie posty projektów:
DELETE
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;
Tabela stanowisk nie ma klucza obcego client_id
, tylko project_id
. Chcę usunąć posty w projektach, które przeszły client_id
.
To nie działa teraz, ponieważ żadne posty nie są usuwane.
DELETE posts FROM posts JOIN projects ...
raczej niżIN (subquery)
wzór. (Odpowiedź Yehosefa podaje przykład preferowanego wzoru.)alias
nazwy tabeli i użyć jej.Odpowiedzi:
Musisz tylko określić, że chcesz usunąć wpisy z
posts
tabeli:EDYCJA: Aby uzyskać więcej informacji, możesz zobaczyć tę alternatywną odpowiedź
źródło
DELETE d FROM posts AS d JOIN projects AS p ON ...
DELETE posts , projects FROM posts INNER JOIN projects ON projects.project_id = posts.project_id WHERE projects.client_id = :client_id
Ponieważ wybierasz wiele tabel, tabela, z której chcesz usunąć, nie jest już jednoznaczna. Musisz wybrać :
W takim przypadku
table_name1
itable_name2
są w tej samej tabeli, więc to zadziała:Możesz nawet usunąć z obu tabel, jeśli chcesz:
Uwaga:
order by
ilimit
nie działa w przypadku usuwania wielu tabel .Pamiętaj również, że jeśli deklarujesz alias dla tabeli, musisz użyć aliasu w odniesieniu do tabeli:
Wkłady Carpetsmoker itp .
źródło
ON
wielkich / małych liter , to prawda, możesz użyć dowolnego stylu, który ci się podoba, ale w swojej odpowiedzi tak naprawdę miksujesz style, które uważasz za wygodne - to jest wielkie. Mniej doświadczonym programistom może powiedzieć, że jest okropny i niespójny pod względem stylu.Lub to samo, z nieco inną składnią (bardziej przyjazną dla IMO):
BTW, z mysql za pomocą złączeń jest prawie zawsze znacznie szybszy niż podzapytania ...
źródło
USING
: stackoverflow.com/questions/11366006/mysql-on-vs-usingMożesz także użyć ALIAS w ten sposób, to działa właśnie użyłem go w mojej bazie danych! t oznacza, że tabela wymaga usunięcia!
źródło
Jestem bardziej przyzwyczajony do rozwiązania tego podzapytania, ale nie wypróbowałem tego w MySQL:
źródło
MySQL DELETE rekordy z JOIN
Zasadniczo używasz INNER JOIN w instrukcji SELECT, aby wybierać rekordy z tabeli, która ma odpowiadające rekordy w innych tabelach. Możemy również użyć klauzuli INNER JOIN z instrukcją DELETE, aby usunąć rekordy z tabeli, a także odpowiednie rekordy z innych tabel, np. Aby usunąć rekordy z tabel T1 i T2, które spełniają określony warunek, możesz użyć następującej instrukcji:
Zauważ, że wstawiasz nazwy tabel T1 i T2 między DELETE i FROM. Jeśli pominiesz tabelę T1, instrukcja DELETE usunie tylko rekordy w tabeli T2, a jeśli pominiesz tabelę T2, tylko rekordy w tabeli T1 zostaną usunięte.
Warunek łączenia T1.key = T2.key określa odpowiednie rekordy w tabeli T2, które należy usunąć.
Warunek w klauzuli WHERE określa, które rekordy w T1 i T2 należy usunąć.
źródło
Usuwanie pojedynczej tabeli:
Aby usunąć wpisy z
posts
tabeli:Aby usunąć wpisy z
projects
tabeli:Aby usunąć wpisy z
clients
tabeli:Usuń wiele tabel:
Aby usunąć wpisy z wielu tabel z połączonych wyników, należy podać nazwy tabel po
DELETE
liście rozdzielanej przecinkami:Załóżmy, że chcesz usunąć wpisy z wszystkich trzech tabel (
posts
,projects
,clients
) dla konkretnego klienta:źródło
Spróbuj jak poniżej:
źródło
Inną metodą usuwania przy użyciu wyboru podrzędnego, która jest lepsza niż użycie,
IN
byłabyWHERE
EXISTS
Jednym z powodów, aby używać tego zamiast łączenia jest to, że a
DELETE
zJOIN
zabrania używaniaLIMIT
. Jeśli chcesz usunąć w blokach, aby nie tworzyć pełnych blokad tabeli, możesz dodaćLIMIT
tęDELETE WHERE EXISTS
metodę.źródło
posts
EXISTS () jest taka samaposts
, jak z której usuwane są wiersze. (W każdym razie IMHO)DELETE p FROM posts p WHERE EXISTS ( SELECT 1 FROM projects WHERE projects.client_id = p.client_id);
USUŃ rekordy z jednej tabeli:
USUŃ ZAPISY Z obu tabel:
źródło
Jeśli dołączenie nie działa, możesz wypróbować to rozwiązanie. Służy do usuwania osieroconych rekordów z t1, gdy nie używa się kluczy obcych + specyficzny warunek where. To znaczy usuwa rekordy z tabeli 1, które mają puste pole „kod” i które nie mają rekordów w tabeli 2, pasujące do pola „nazwa”.
źródło
Spróbuj tego,
źródło
- Pamiętaj, że nie możesz użyć aliasu nad tabelą, w której chcesz usunąć
źródło