Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Mysql delete em uma tabela por id de outra tabela


Use delete junto com join assim:
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 |
+------+

Isso é dimensionado para um número arbitrário de tabelas, por exemplo:
DELETE a 
FROM a 
JOIN b ON a.idA=b.idA 
JOIN c ON b.idB=c.idB;

Isso excluirá de a todos os registros que são referidos desses registros de b que por sua vez são referenciados de c . Você também pode adicionar a cláusula WHERE assim:
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';

Se você deseja limitar o número de linhas a serem excluídas, faça assim:
DELETE a 
FROM a 
JOIN b ON a.idA=b.idA 
JOIN c ON b.idB=c.idB
LIMIT 500000;

Se você deseja excluir as primeiras 500.000 linhas, precisa refinar quais linhas são as primeiras, portanto, é necessário estabelecer alguma ordem entre as linhas. Em outras palavras, você precisa classificar as linhas por alguns critérios e, em seguida, limitar assim:
DELETE a 
FROM a 
JOIN b ON a.idA=b.idA 
JOIN c ON b.idB=c.idB
ORDER BY a.something
LIMIT 500000;