Utilisez delete
avec join
comme ceci :
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 |
+------+
Cela s'adapte à un nombre arbitraire de tables, par exemple :
DELETE a
FROM a
JOIN b ON a.idA=b.idA
JOIN c ON b.idB=c.idB;
Cela supprimera de a
tous les enregistrements qui sont référencés à partir de ces enregistrements de b
qui sont à leur tour référencés depuis c
. Vous pouvez également ajouter une clause WHERE comme celle-ci :
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';
Si vous souhaitez limiter le nombre de lignes à supprimer, procédez comme ceci :
DELETE a
FROM a
JOIN b ON a.idA=b.idA
JOIN c ON b.idB=c.idB
LIMIT 500000;
Si vous souhaitez supprimer les 500 000 premières lignes, vous devez affiner les premières lignes, vous devez donc établir un ordre parmi les lignes. En d'autres termes, vous devez trier les lignes selon certains critères, puis limiter comme ceci :
DELETE a
FROM a
JOIN b ON a.idA=b.idA
JOIN c ON b.idB=c.idB
ORDER BY a.something
LIMIT 500000;