Quero juntar duas tabelas e excluí-las.
tabela 1:
|ID| DATA|
mesa 2:
|ID | ID_TAB1|
A consulta é semelhante a esta:
delete from table2
using table2 as t2 left join table1 as t1
on t2.ID_TAB1=t1.ID
where t1.DATA='xxx';
O problema é que existe uma terceira mesa:
Tabela 3:
|ID|ID_TAB2|
Quando eu executo minha declaração, ela falha em dizer
Atualizar ou deletar na tabela table2 viola a restrição de chave estrangeira na tabela table3
Tenho certeza de que não há dados na tabela3 conectados a linhas com, t1.DATA='xxx'
então, por que há esse erro? Minha consulta não está correta?
Esta consulta:
delete from table2
using table2 as t2 left join table1 as t1
on t2.ID_TAB1=t1.ID
where t1.DATA='xxx';
Na verdade, está excluindo todas as linhas de table2
(ou nenhuma, se não houver correspondência em where
. Você não tem nenhuma conexão entre t2
e table2
, então isso é essencialmente uma junção cruzada).
Conforme explicado (profundamente) na documentação :
Não repita a tabela de destino na using_list, a menos que você deseje configurar uma self-join.
Presumivelmente, a exclusão de todas as linhas está causando o problema com a terceira tabela. Observe que as linhas que você realmente deseja excluir também podem estar causando o problema. Nesse caso, você precisa lidar com os erros usando algum tipo de lógica em cascata.
Você pode expressar isso usando uma using
cláusula e removendo join
:
delete from table2 t2
using table1 t1
where t2.ID_TAB1 = t1.ID and
t1.DATA = 'xxx';
Ou apenas use exists
na where
cláusula:
delete from table2 t2
where exists (select 1
from table1 t1
where t1.id = t2.id_tab1 and t1.data = 'xxx'
);
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras