Use
delete
junto com join
assim: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 |
+------+
Isso é dimensionado para um número arbitrário de tabelas, por exemplo:
DELETE a
FROM a
JOIN b ON a.idA=b.idA
JOIN c ON b.idB=c.idB;
Isso excluirá de
a
todos os registros que são referidos desses registros de b
que por sua vez são referenciados de c
. Você também pode adicionar a cláusula WHERE assim: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 você deseja limitar o número de linhas a serem excluídas, faça assim:
DELETE a
FROM a
JOIN b ON a.idA=b.idA
JOIN c ON b.idB=c.idB
LIMIT 500000;
Se você deseja excluir as primeiras 500.000 linhas, precisa refinar quais linhas são as primeiras, portanto, é necessário estabelecer alguma ordem entre as linhas. Em outras palavras, você precisa classificar as linhas por alguns critérios e, em seguida, limitar assim:
DELETE a
FROM a
JOIN b ON a.idA=b.idA
JOIN c ON b.idB=c.idB
ORDER BY a.something
LIMIT 500000;