Olá desenvolvedores, hoje aprenderemos com o delete a exclusão de dados em cascata, onde ao excluir registros da tabela filho, excluiremos também o dado referenciado na tabela pai. A questão primordial aqui é, como deletar dados quando temos tabelas relacionadas? Antes de entendermos o que deveremos fazer vamos conferir a nossa tabela com os dados relacionados.
Vimos que em situações onde existem duas ou mais tabelas relacionadas o inner join estabelece a ligação entre elas. Assim, para exibir os dados relacionados de duas tabelas em uma única tabela, procederemos com a seguinte query.
SELECT nome, numero, tipo, email FROM telefoneuser AS fone
INNER JOIN userposjava AS userpos
ON fone.usuariopessoa = userpos.id;
Observe acima que selecionamos para serem exibidos apenas o nome e o e-mail da tabela “userposjava” e o número e o tipo de telefone da tabela “telefoneuser”. E importante, necessariamente nesta ordem. Para isso temos indicamos na query o que deverá ser exibido e como deverá ser exibido. Veja abaixo o resultado.
ERRO DE EXCLUSÃO
Agora se tentarmos excluir o registro 13 da tabela “userposjava” que você pode identificar na tabela acima como sendo do Danne Meira, por exemplo, um erro será exibido. Este erro ocorre porque essa tentativa de exclusão viola a restrição de chave estrangeira, visto que este dado registro é referenciado em outra tabela, no caso, a “telefoneuser”.
Em outras palavras se apagarmos algum dado da tabela pai, os dados da tabela filho relacionados a ele ficarão sem referência. Dessa forma se tencionamos excluir algum registro, temos que excluí-lo primeiro na tabela filho.
EXCLUINDO REGISTRO DIRETO NA BASE DE DADOS
Então para excluirmos um registro por completo, vamos primeiro excluir o dado relacionado na tabela filho. Assim, se quero excluir o registro cujo id é 13 e refere-se ao Danne Meira, primeiro devemos excluir todas as referências que se encontram na tabela filho, que são o número e tipo de telefone. Atualize e depois digite a segunda query selecione-a e atualize pressionando a tecla de função F5.
DELETE FROM telefoneuser WHERE usuariopessoa = 13
SELECT * FROM telefoneuser
Quando exibimos a tabela “telefoneuser” podemos constatar que a referência ao id 13 não existe mais.
Vamos proceder com a continuação da exclusão dos dados no Java usando o JDBC – Java Database Connectivity ou JDBC.
EXCLUINDO REGISTRO COM JAVA
No Java criaremos um método público para deletarmos os dados por usuário, ou seja, um usuário por vez. O método cuja assinatura é mostrada abaixo receberá como parâmetro o ID.
No escopo do método implementaremos dentro de um bloco try duas Strings sql, onde a primeira receberá a query para deletar os registros da tabela filho e segunda receberá os registros vindos da tabela pai. Ambas as querys deverão estar concatenadas com o ID correspondente.
public void deletFonePorUser(Long idUser) {
try{
String sqlFone = "DELETE FROM telefoneuser WHERE usuariopessoa = "+idUSer"
String sqlUser = "DELETE FROM userposjava WHERE id = "idUser";
}
}
O bloco try acima implementa ainda o objeto PreparedStatement cuja responsabilidade será deletar os registros. O delete será feito a partir do objeto connection invocando a instrução prepareStatement que recebe como parâmetro o sql que instanciamos na linha de código acima.
PreparedStatement preparedStatement = connection.prepareStatement(sqlFone);
O objeto preparedStatement cumpre o objetivo de invocar o método executeUpdate(). O método executeUpdate() Executa a instrução SQL no objeto SQLServerPreparedStatement, que deve ser uma instrução SQL INSERT, UPDATE, MERGE ou DELETE. E por fim invocaremos um commit para gravar as alterações após deletarmos um dado registro.
preparedStatement.executeUpdate();
connection.commit();
E da mesma forma procederemos para deletar registros da tabela pai “userposjava”.
preparedStatement = connection.prepareStatement(sqlUser);
preparedStatement.executeUpdate();
connection.commit();
IMPLEMENTAÇÃO NA CLASSE DE TESTES
E por fim, para rodarmos um teste implementaremos na classe de Teste o método testeDeleteUserFone, onde instanciaremos o objeto DAO.
public void testeDeleteUserFone () {
UserPosDAO dao = new UserPosDAO();
dao.testeDeleteUserFone (12L);
Deletamos todos os registros e referências cujo id é igual a 12, “rode” o teste e atualize o banco de dados para verificar se os registros formam excluídos com sucesso.
EM POUCAS PALAVRAS
É importante que você compreenda que temos que respeitar a hierarquia de tabelas, ou seja, não podemos apagar dados na tabela pai, sem fazer o mesmo com a referência destes dados na tabela filho. Então primeiro apagamos os dados na tabela filho, para então deletarmos as suas referências na tabela pai.
E se você quiser baixar o código fonte de tudo o que fizemos nesta série de introdução prática ao SQL e ao JDBC em Java, é só clicar neste link. Espero que tenha aprendido a utilizar o delete de forma respnsável em suas aplicações. Eu fico por aqui, nos vemos no próximo tutorial.