Usar delete
junto con join
así:
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 |
+------+
Esto se escala a un número arbitrario de tablas, por ejemplo:
DELETE a
FROM a
JOIN b ON a.idA=b.idA
JOIN c ON b.idB=c.idB;
Esto eliminará de a
todos los registros a los que se hace referencia desde esos registros de b
que a su vez son referidos desde c
. También puede agregar una cláusula WHERE como esta:
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 desea limitar el número de filas que se eliminarán, haga lo siguiente:
DELETE a
FROM a
JOIN b ON a.idA=b.idA
JOIN c ON b.idB=c.idB
LIMIT 500000;
Si desea eliminar las primeras 500000 filas, debe refinar qué filas son las primeras, por lo que debe establecer un orden entre las filas. En otras palabras, debe ordenar las filas según algunos criterios y luego limitarlas de esta manera:
DELETE a
FROM a
JOIN b ON a.idA=b.idA
JOIN c ON b.idB=c.idB
ORDER BY a.something
LIMIT 500000;