Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mysql supprimer dans une table par les identifiants d'une autre table

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;