Użyj delete
razem z join
tak:
mysql> create table a (id int);
mysql> insert into a values (1), (2), (3), (4);
mysql> create table b (id int);
mysql> insert into b values (2), (3);
mysql> delete a from a join b on a.id=b.id where b.id > 2;
mysql> select * from a;
+------+
| id |
+------+
| 1 |
| 2 |
| 4 |
+------+
Skaluje się do dowolnej liczby tabel, np.:
DELETE a
FROM a
JOIN b ON a.idA=b.idA
JOIN c ON b.idB=c.idB;
Spowoduje to usunięcie z a
wszystkie rekordy, do których odwołuje się te rekordy b
które z kolei są przywoływane z c
. Możesz również dodać klauzulę WHERE w następujący sposób:
DELETE a
FROM a
JOIN b ON a.idA=b.idA
JOIN c ON b.idB=c.idB
WHERE a.status='done' AND
b.status='open' AND
c.status='open';
Jeśli chcesz ograniczyć liczbę wierszy do usunięcia, zrób tak:
DELETE a
FROM a
JOIN b ON a.idA=b.idA
JOIN c ON b.idB=c.idB
LIMIT 500000;
Jeśli chcesz usunąć pierwsze 500000 wierszy, musisz doprecyzować, które wiersze są pierwsze, więc musisz ustalić kolejność między wierszami. Innymi słowy, musisz posortować wiersze według pewnych kryteriów, a następnie ograniczyć w ten sposób:
DELETE a
FROM a
JOIN b ON a.idA=b.idA
JOIN c ON b.idB=c.idB
ORDER BY a.something
LIMIT 500000;