Usa delete
insieme a join
così:
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 |
+------+
Questo viene ridimensionato a un numero arbitrario di tabelle, ad esempio:
DELETE a
FROM a
JOIN b ON a.idA=b.idA
JOIN c ON b.idB=c.idB;
Questo cancellerà da a
tutti i record a cui si fa riferimento da quei record di b
che sono a loro volta richiamati da c
. Puoi anche aggiungere la clausola WHERE in questo modo:
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';
Se vuoi limitare il numero di righe da eliminare, procedi in questo modo:
DELETE a
FROM a
JOIN b ON a.idA=b.idA
JOIN c ON b.idB=c.idB
LIMIT 500000;
Se vuoi eliminare le prime 500000 righe, devi perfezionare quali righe sono le prime, quindi devi stabilire un ordine tra le righe. In altre parole, devi ordinare le righe in base ad alcuni criteri e quindi limitare in questo modo:
DELETE a
FROM a
JOIN b ON a.idA=b.idA
JOIN c ON b.idB=c.idB
ORDER BY a.something
LIMIT 500000;