[RESOLVIDO] Problema com delete com relacao com 3 tabelas

Galera eu tenho uma tabela Endereço que e relacionada com 3 tabelas de 1 para muitos , tabela cliente, funcionário e fornecedor.

o meu problema e na hora de deletar.

EX:

a medida q vc adiciona o cliente o fornecedor e funcionário a id do Endereco quando deletada eles ficam diferentes das tabelas quando são adicionadas ,não são mais iguais ,

Ex: idcliente = 3 idendereco =5 para deletar tinha q ser ( = ) igual, aqui no caso não e, então não ira remover .

EX: idcliente = 2 idendereco = 2 são iguais, assim deleta por que sao iguais.

Agora eu não sei como resolvo isso, pq a medida q vc deleta o cliente a id quando são adicionada vão ser tudo diferente.

Aqui esta o método de remover de duas tabelas

Do cliente

  public void remove(Cliente c1) throws SQLException{
         
           String sql;
           sql = "delete cliente,Endereco from cliente INNER JOIN Endereco ON Endereco.idEndereco = cliente.codcliente WHERE cliente.codcliente = ?  ";
           try (PreparedStatement stmt = conexao.prepareStatement(sql)) { 
               stmt.setInt(1,c1.getCodcliente());
               stmt.execute();
           }  
         }   
       }    

Aqui esta do fornecedor

  public void remove(Fornecedor c1) throws SQLException{
String sql;
 
           sql = "delete fornecedor,Endereco from fornecedor INNER JOIN Endereco ON Endereco.idEndereco = fornecedor.idfornecedor WHERE fornecedor.idfornecedor = ? ";
           try (PreparedStatement stmt = conexao.prepareStatement(sql)) { 
               stmt.setLong(1,c1.getIdfornecedor());
               stmt.execute();
           }  
        }
    

Se alguém souber em como eu posso sanar esse erro, agradecerei muito.

Mas a idéia de ter tabelas separadas é justamente essa.
Você não precisa ter o mesmo id para todos. Pense no seguinte, cada cliente pode ser cliente de vários fornecedores. Cada fornecedor pode ter vários endereços…
Assim sendo, como você pode ter três registros na tabela endereço com o mesmo identificador? É possível, mas não o adequado.
Estude sobre PK e FK, vai ser mais fácil de entender isso.

Eu sei que a id não pode ser para todos,por isso a separação por id ,acho que você não entendeu meu problema.
e o seguinte para min poder deletar Ex:( id do meu cliente e fk do endereco que esta na tabela do cliente tem que ser iguais),a medida que eu vó adicionando ex: id fornecedor a fk que esta no endereço já vai ser diferente ai eu não conseguido deletar mais.
estou testando aqui tmb , um delete para min poder deletar as fk que fica diferente das pk de cada tabela , mas não estou conseguindo.

Obrigado.

Ninguém tem mais ida de como eu posso resolver esse problema?

Cannot delete or update a parent row: a foreign key constraint fails (salao.cliente, CONSTRAINT fk_cliente_Endereco1 FOREIGN KEY (idEndereco) REFERENCES endereco (idEndereco) ON DELETE NO ACTION ON UPDATE NO ACTION)

Aqui galera esta tendo esse erro, mesmo com o banco cascade.

Isso é ocasionado por que você tenta deletar um registro em uma tabela que está associado a registros existentes em outras. Você deverá deletar primeiro as entradas que estão ligadas à este registro.
O detalhe não é o cascade é a constraint que foi criada (ON DELETE NO ACTION e ON UPDATE NO ACTION).

Eu sei disso que e por causa das contraint pq estou com 3 tabelas com a fk do endereço, por que eu vou usar
constantemente as 3 tabelas , não tem como o cliente saber qual entrada ele deve apagar primeiro ,entendeu?.
ou então o único jeito e apagar tabela endereço e colocar os mesmo atributos nas outras tabelas, eu
tmb já testei um comando no banco q anula as fk para min poder deletar etc. e não funcionou também.

SET FOREIGN_KEY_CHECKS=0

Obrigado por estar me ajudando,mas estou sem saída.

[quote=junio103]Eu sei disso que e por causa das contraint pq estou com 3 tabelas com a fk do endereço, por que eu vou usar
constantemente as 3 tabelas , não tem como o cliente saber qual entrada ele deve apagar primeiro ,entendeu?.
ou então o único jeito e apagar tabela endereço e colocar os mesmo atributos nas outras tabelas, eu
tmb já testei um comando no banco q anula as fk para min poder deletar etc. e não funcionou também.

SET FOREIGN_KEY_CHECKS=0

Obrigado por estar me ajudando,mas estou sem saída.[/quote]

você tem 1 cliente, este cliente tem muitos endereços certo ?

então eu tenho as tabelas:

Cliente (idCliente, nome, cpf);
e
Endereco(idEndereco, IdCliente, logradouro, numero, estado) -> idCliente é uma chave estrangeira para tabela Cliente

para deletar os endereços e o cliente:

[code]Delete from Endereco where idCliente = “aqui é o id do seu cliente”;

Delete from Cliente where idCliente = “aqui é o id do seu cliente”;[/code]

Pq vc não usa o CASCADE no ON DELETE? Dessa forma qdo vc apagar o registro da tabela principal o registro com a chave estrangeira será apagado tbm.

1 curtida

pq ai ele não vai aprender como funciona.

poise já usei cascade nas minhas 3 tabelas q recebem a fk de endereço, so que o problema que ele apaga, mas num certo momento ele para de apagar mas não da nada de erro

e minha tabelas esta 1 endereço para muito cliente .1 endereço para muito funcionários, será q o erro esta ai?

Eu fiz uma aplicação nesse estilo, e a minha melhor solução foi tirar esse seu inner join do delete…

Deleta primeiro os valores dependentes e depois os independentes… por exemplo:

Primeiro delete o endereço (um endereço não existe sem o funcionário)
Depois delete o funcionário (o funcionário existe sem o endereço)

Uma coisa de cada vez… uma dica é você usar o begin transaction… faz isso dentro de um try catch que fica bonito

pq ai ele não vai aprender como funciona.[/quote]

Entender como funciona não quer dizer q não possa utilizar recursos para auxiliar, contanto q saiba o q está fazendo.

pq ai ele não vai aprender como funciona.[/quote]

Entender como funciona não quer dizer q não possa utilizar recursos para auxiliar, contanto q saiba o q está fazendo.[/quote]

a sim, eu só justifiquei por que eu não falei sobre o cascade…e como podemos ver, ele ainda não imagina o que estava fazendo rsrs.

o erro esta exatamente ai =)

tente pensar assim: um cliente pode ter vários endereços, casa, trabalho, casa da praia, casa de férias. fazenda.

sendo assim, o “Endereço” precisa saber a quem ele pertence.

é inapropriado fazer assim:

Cliente(idCliente, nome,sobrenome,idEndereco1,idEndereco2,idEndereco3…4.5.6.7 10000)

agora a forma correta, digamos que eu queira incluir dois endereços cujo id do cliente seja 8

endereco(“aqui pode ser um id automatico(sequence)”, “rua malvatares”, 8)
endereco(“aqui pode ser um id automatico(sequence)”, “rua dos vinte bois”, 8)

então pra deletar…

delete from endereco where idcliente = 8…// vai excluir todos os endereços do cliente id 8

Com uma tabela ate que daria desse jeito mesmo , mas tem 3 tabelas.

vmu la, fiz ai do seu jeito, agora a tabela endereço tem 3 fk,por ai já vai dar erro pq ,quando eu for adicionar ela vai precisar das outras fk ,para poder adicionar,
o meus 3 form de cadastro contem todos os campos de endereço,Entendeu por isso eu q deste jeito não ira funcionar,pq a tabela endereco necessita das outras fk,
se eu fosse fazer um outro form de endereço ai sim iria funcionar, pq ele já iria pegar as fk das outras tabelas.Ao me ver né.

Obrigado a todos por estar me ajudando.

você pode usar as 3 FKs e na hora de criar preencher só 1…

mas talves não seja a melhor maneira, pense na modelagem… quando você diz cliente, vai ser uma pessoa, ou poderia ser uma empresa ? e no caso de fornecedor ? e o funcionario ?

sua dúvida não esta em SQL… esta em Modelagem…MER…DER…procure alguns exemplos na internet e Diagramas DER etc… vai dar uma clareada no seu problema e vai começar a entender onde colocar as FKs…

Caso finalmente resolvido,

Eu tive que modificar meu banco colocando todas as 3 afk dentro de endereço , e colocando null nas tabelas, i no inserir você adiciona primeiro o cliente e depois endereço,usando o
last ID ,no endereço para adicionar fk na tabela endereço.

Agora eu posso adicionar quantos cliente e funcionários e fornecedores e excluir que não vai dar problema de fk.

Agradeço a todos que vem me ajudando.obg!.