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.
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]
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
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é.
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…
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.