sql >> Base de Datos >  >> RDS >> Mysql

Eliminar mysql en una tabla por id de otra tabla

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;