WHERE É VIDA
Preciso começar este post com a minha frase favorita! “WHERE É VIDA!” Porque eu disse isso? Porque se você não impor nenhuma condição quando fizer um UPDATE nos registros de uma tabela, TODOS os registros serão alterados, e isso pode custar seu emprego, sua noite de sono e o pior, a sua reputação.
Agora que você já está convencido que em 99,9% dos casos você utilizará uma condição para atualizar seus dados, vamos começar a conversar sobre a atualização dos registros de uma tabela, que é feita com o comando UPDATE.
Se você chegou agora, veja os posts anteriores onde configuramos o SQL no Azure e configuramos o SQL Server 2017 em uma máquina virtual (que tem o sistema operacional Ubuntu); inserimos dados no nosso banco de dados de teste.
Post 1 – Você conhece o SQL Server 2017?
Post 2 – SQL Server 2017 – Termos importantes e Restore
Post 4 – 5 maneiras de incluir dados no SQL Server 2017 (e no SQL Azure)
Antes de conversarmos sobre a sintaxe e o uso do comando, é importante você considerar os seguintes pontos super importantes para o sucesso da sua aplicação:
- Se você irá fazer um conjunto de operações que devem ser consideradas como uma unidade (ou faz tudo, ou não faz nada), você precisa usar uma transação. Saiba mais sobre transações no post onde conversamos sobre este assunto.
- O update é um comando complexo para o mecanismo interno (engine) do SQL Server. Sempre que sua aplicação precisar de muitos updates, eu aconselho você a verificar se existem outras alternativas. Não significa que você nunca deve usar! Significa que você precisa fazer uma análise cuidadosa.
- O comando UPDATE pode impactar negativamente nos seus índices. Por exemplo, suponha que você tem um índice que utiliza a coluna dt_ultima_compra. Sempre que o seu cliente faz uma compra, a aplicação faz um UPDATE na coluna atualizando seu valor para a data corrente. A engine do SQL Server deverá atualizar a coluna da sua dt_ultima_compra e também o índice que utiliza aquela coluna. Percebe que o trabalho da engine é dobrado? Imagina se a mesma coluna é atualizada e acessada por milhões de usuários? Imagina se existem outros 20 índices usando a mesma coluna? Conseguem visualizar a questão arquitetural que envolve o comando de atualização? Se não consegue visualizar, me chama para conversarmos 🙂
Novamente chamo a sua atenção, contra os extremismos. Não estou dizendo para você nunca utilizar índices em uma coluna cujo valor pode ser atualizado. Estou te dizendo que você precisa avaliar muito bem se as atualizações não terão consequências negativas nas consultas que utilizam índices. Te convido para dar uma olhada nas considerações que eu fiz no último post, nele veja o item “Análise Prévia”
O comando UPDATE
O comando update dá a seguinte instrução para a engine do banco de dados:
Atualize a tabelaX , atribuindo para a colunaK o valor Y somente se os valores da colunaZ obedecem a uma dada condição.
Traduzindo a frase para a linguagem T-SQL:
UPDATE tabelaX SET colunaK = Y WHERE colunaZ = condição
Simples assim! O comando de UPDATE atualiza os valores das colunas, somente se uma condição é satisfeita.
Dicas da Dani… Atualizar dados é mais crítico do que perde-los! Então para executar os comandos “na certeza” faça o seguinte:
1 – Monte um comando SELECT usando seu comando de atualização:
- O nome da tabela passa para a clausula FROM
- O nome das colunas passa para a claúsula SELECT
- E a condição continua na clausula WHERE
Usando o exemplo anterior, o select ficaria assim:
SELECT colunaK FROM tabelaX WHERE colunaZ = condição
O SELECT te ajuda a ver se o seu comando tem sentido, se a sua condição é válida, se você escolheu a coluna certa.
2 – Execute o seu comando no ambiente de testes. Em 99.9% dos casos os dados são diferentes, mas a estrutura das tabelas é igual, o que ajuda muito nos testes.
Facilidades
Como incrementar o valor de uma coluna, com o comando UPDATE de forma rápida?
UPDATE Sales.MyOrderDetails SET discount += 0.05 WHERE orderid = 10251;
E se você quiser diminuir o desconto do cliente?
UPDATE Sales.MyOrderDetails SET discount -= 0.05 WHERE orderid = 10251;
Imagine que você precisasse devolver para a sua aplicação o valor do desconto atualizado. Temos 2 formas de fazer isso. A primeira é fazer o UPDATE do desconto e depois fazer um SELECT para buscar o valor atualizado. A segunda é criar uma variável que armazene o valor atualizado. Vamos ver passo a passo:
--Crie a variável DECLARE @newdiscount AS NUMERIC(4, 3) = NULL; --Atualize o desconto de um determinado produto (veja que a operação deve retornar somente um desconto UPDATE Sales.MyOrderDetails SET @newdiscount = discount += 0.05 WHERE orderid = 10250 AND productid = 51; --Selecione o valor do novo desconto SELECT @newdiscount;
Para finalizar…
O comando de atualização é simples. Mas precisa ser executado com certeza, uma vez que dados incorretos são mais perigosos do que dados inexistentes.
Atualizar dados de forma incorreta pode custar seu trabalho, a reputação da empresa, seu sono, e a sua reputação.
Temos um ambiente bem bacana para testes! Avalie os comandos, crie outros, atualize tabelas no SQL Server 2017 e no SQL Azure… Temos um ambiente propicio para você fazer todo tipo de “loucura”. Depois me diga se você identificou alguma diferença entre os comandos executados no SQL Server 2017 e no SQL Azure. Os comandos usados neste post estão no Github.
Tenho 3 “dicas de ouro” para você, e imploro que você as siga:
- Sempre faça um SELECT para verificar se os dados que você vai atualizar;
- Verifique seus comandos em um ambiente de testes;
- SEMPRE que você for escrever um comando UPDATE (ou DELETE) escreva primeiro a condição, depois escreva a tabela e as colunas atualizadas! Condição primeiro, restante do comando depois
Lembre-se que o comando UPDATE não é trivial para a engine
Conclusão
WHERE é VIDA!