Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL löscht in einer Tabelle nach IDs aus einer anderen Tabelle

Verwenden Sie delete zusammen mit join so:

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 |
+------+

Dies skaliert auf eine beliebige Anzahl von Tabellen, z. B.:

DELETE a 
FROM a 
JOIN b ON a.idA=b.idA 
JOIN c ON b.idB=c.idB;

Dadurch wird a gelöscht alle Datensätze, auf die von diesen Datensätzen von b verwiesen wird die wiederum von c referenziert werden . Sie können auch eine WHERE-Klausel wie diese hinzufügen:

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';

Wenn Sie die Anzahl der zu löschenden Zeilen begrenzen möchten, gehen Sie folgendermaßen vor:

DELETE a 
FROM a 
JOIN b ON a.idA=b.idA 
JOIN c ON b.idB=c.idB
LIMIT 500000;

Wenn Sie die ersten 500000 Zeilen löschen möchten, müssen Sie verfeinern, welche Zeilen zuerst sind, also müssen Sie eine gewisse Reihenfolge zwischen den Zeilen festlegen. Mit anderen Worten, Sie müssen Zeilen nach bestimmten Kriterien sortieren und dann wie folgt einschränken:

DELETE a 
FROM a 
JOIN b ON a.idA=b.idA 
JOIN c ON b.idB=c.idB
ORDER BY a.something
LIMIT 500000;