WHERE É VIDA!!!
Eu não poderia falar do comando DELETE sem destacar a importância da clausula WHERE.
Sabe porquê? Sem uma condição adequada você pode excluir dados importantes do seu banco de dados.
Há alguns meses atrás foram excluídos dados de 16 mil aposentadorias do TCE-Amazonas. Imagine se a sua vó fosse receber a aposentadoria dela e fosse informada que a aposentadoria dela não existe? (Eu já falei sobre isso aqui no blog por favor, leia este post!)
Você tem noção do impacto que um comando mal escrito pode ter na vida das pessoas? Você consegue ver o quanto nosso trabalho é importante para a sociedade?
Se o DELETE é tão perigoso porque existe?
Simplesmente para que você possa exclui os dados de uma tabela que obedecem a uma determinada condição.
A operação de exclusão, assim como o UPDATE é uma operação pesada para a engine, por isso é preciso pensar um pouco antes de sair excluindo os registros. Pense como um arquiteto e não como um maluco.
Considerações sobre o DELETE
Os índices
Quando é feita a exclusão de um conjunto de registros, a engine do SQL precisa localizar os registros que serão excluídos, e a localização é muito mais rápida com os índices.
Seria perfeito se não fosse necessário excluir os dados da tabela e do índice!
Além disso conforme os dados são excluídos do índice, a sua estrutura vai ficando uma baderna, fazendo com que eles sejam menos eficientes.
Como resolver este caso? Agendando as manutenções dos índices. Em breve abordaremos este assunto, mas se você quiser se adiantar recomendo que leia este artigo
Os bloqueios
Por padrão, um comando DELETE causa um bloqueio exclusivo na tabela e mantém esse bloqueio até que a operação seja concluída.
O que isso quer dizer? Que com um bloqueio exclusivo, nenhuma outra operação pode modificar os dados; operações de leitura podem ser realizadas apenas com o uso do hint NOLOCK * ou nível de isolamento de leitura não confirmada (READ UNCOMMITTED)**.
Transações
Tudo o que eu falei sobre as transações nos últimos posts vale para o comando DELETE também. Por favor, leia os posts anteriores sobre o comando INSERT e sobre o comando UPDATE
Exclusão de todas as linhas da tabela
Eu sei que podem ocorrer situações onde todas as linhas de uma tabela precisam ser excluídas. Neste caso, você pode usar o comando TRUNCATE.
A sintaxe é muito simples:
TRUNCATE TABLE nomeTabela
Sobre as características deste comando é bom você saber:
- Este comando exclui todos os dados da tabela, não permite para a exclusão,
- Se a tabela tem uma coluna auto incremental (identity) então o valor desta coluna será reiniciado;
- Se a tabela possui relacionamentos o comando TRUNCATE não pode ser executado
O comando DELETE
O comando DELETE é o mais fácil de todos. Ele diz para a engine do banco de dados excluir da tabela as linhas que possuem dados que obedecem a uma determinada condição.
Traduzindo para o T-SQL:
DELETE FROM nomeTabela WHERE suaCondição
Treino
Para que você não esqueça o comando DELETE, vamos fazer alguns testes em nossa máquina virtual (saiba mais sobre o ambiente virtual neste post).
Execute os comandos no SQL Server 2017 e no SQL Azure também, veja se há diferenças e me conte depois.
O script abaixo, está disponível no GitHub.
SELECT CustomerID, SalesPersonID, orderdate, N'USA' as shipcountry, freight INTO Sales.MyOrders_Delete FROM Sales.SAlesOrderHeader WHERE SalesPersonID is not NULL
SELECT CustomerID, SalesPersonID, orderdate, shipcountry, freight FROM Sales.MyOrders_Delete WHERE SalesPersonID = 282
DELETE FROM Sales.MyOrders_Delete WHERE SalesPersonID = 282
TRUNCATE TABLE Sales.MyOrders_Delete
SELECT CustomerID, SalesPersonID, orderdate, shipcountry, freight FROM Sales.MyOrders_Delete
Conclusão
Where é vida!
O comando delete exclui as linhas de uma tabela que obedeçam a uma determinada condição.
Antes de executar o comando DELETE fique atento às dicas da Dani:
- Escreva um comando SELECT e verifique se a condição que você escreveu é válida;
- TESTE seu comando em um ambiente de testes.
- Escreva primeiro a condição e depois o comando DELETE;
Se não existe condição e todas as linhas da tabela devem ser excluídas, avalie o uso do comando TRUNCATE.
Lembre-se que você é um desenvolvedor iniciante a caminho do sucesso, então vá além de decorar os comandos, avalie quando cada um deles deve ser usado, destaque-se!
* Os hints substituem o comportamento padrão do otimizador de consulta durante a execução de um comando de manipulação de dados especificando um método de bloqueio, um ou mais índices. Os hints são especificadas na cláusula FROM da instrução e afetam apenas a tabela ou view referenciada nessa cláusula. Saiba mais em no site oficial.
** Controla o comportamento dos bloqueios das instruções Transact-SQL emitidas por uma conexão com o SQL Server.
READ UNCOMMITTED
Especifica que as instruções podem ler linhas que foram modificadas por outras transações, mas que ainda não foram confirmadas.
Saiba mais em no site da Microsoft.