SQL UPDATE: Alterar Linhas Existentes
Lição 8.2 · Tempo de leitura: ~7 min · Tarefas para praticar ↓
A instrução SQL UPDATE altera valores em linhas existentes de uma tabela. Nesta lição, você vai aprender a sintaxe UPDATE ... SET ... WHERE, como atualizar várias colunas e calcular novos valores a partir dos atuais, como atualizar linhas com base noutra tabela e como garantir que uma atualização altere apenas as linhas pretendidas.
O INSERT adiciona linhas novas; o UPDATE corrige e mantém as que já existem: um cliente muda de e-mail, os preços sobem, um status passa de "ativo" para "inativo". Um UPDATE pode alterar uma linha ou milhões de linhas numa só instrução, por isso merece o mesmo cuidado que o DELETE.
Os bancos de exemplo do SQLtest são somente leitura, por isso estas instruções devolvem ali um erro de permissão. Os exemplos usam o esquema Sakila.
Sintaxe do UPDATE
UPDATE table_name
SET column1 = value1,
column2 = value2
WHERE condition;
UPDATEindica a tabela.SETlista as colunas e os seus novos valores.WHEREseleciona as linhas a alterar. SemWHERE, todas as linhas da tabela são atualizadas.
Atualizar uma Linha
UPDATE customer
SET email = 'mary.smith@example.com'
WHERE customer_id = 1;
Resultado: uma linha alterada; a condição na chave primária corresponde a exatamente um cliente.
Filtrar pela chave primária é a forma mais segura de alterar uma linha específica: nomes podem repetir-se, chaves não.
Atualizar Várias Colunas
Liste as atribuições no SET, separadas por vírgulas:
UPDATE customer
SET first_name = 'ALICE',
last_name = 'COOPER',
email = 'alice.cooper@example.com'
WHERE customer_id = 42;
Resultado: três colunas do cliente 42 alteradas numa só instrução.
Calcular a Partir do Valor Atual
O lado direito do SET pode usar o valor atual da coluna:
UPDATE film
SET rental_rate = rental_rate + 1.00
WHERE rating = 'NC-17';
Resultado: o valor de aluguel dos 210 filmes NC-17 aumenta $1.
Todas as expressões do SET usam os valores de antes da atualização, por isso SET a = b, b = a troca duas colunas em SQL padrão. O MySQL é uma exceção: aplica as atribuições da esquerda para a direita, e as seguintes já veem os novos valores.
Atualizar Linhas com Base Noutra Tabela
Para alterar linhas por uma condição de outra tabela, use uma subconsulta no WHERE. Aumente em 10% o valor de aluguel de todas as comédias:
UPDATE film
SET rental_rate = rental_rate * 1.10
WHERE film_id IN (
SELECT fc.film_id
FROM film_category AS fc
INNER JOIN category AS c ON c.category_id = fc.category_id
WHERE c.name = 'Comedy'
);
Resultado: o valor das 58 comédias aumenta 10%.
MySQL e MariaDB não permitem que a subconsulta leia a tabela que está a ser atualizada: WHERE film_id IN (SELECT f.film_id FROM film f ...) falha com "You can't specify target table 'film' for update in FROM clause". Escreva a subconsulta sobre as outras tabelas, como acima.
MySQL e MariaDB também suportam um UPDATE de várias tabelas com JOIN:
UPDATE film AS f
INNER JOIN film_category AS fc ON fc.film_id = f.film_id
INNER JOIN category AS c ON c.category_id = fc.category_id
SET f.rental_rate = f.rental_rate * 1.10
WHERE c.name = 'Comedy';
O PostgreSQL usa UPDATE film SET ... FROM film_category, category WHERE ...; o SQL Server usa UPDATE f SET ... FROM film f JOIN ....
Definir um Valor como NULL
UPDATE film
SET original_language_id = NULL
WHERE film_id = 10;
Repare na diferença: SET column = NULL atribui "sem valor", enquanto WHERE column = NULL não corresponde a nada; em condições, use IS NULL.
Verificar Antes de Atualizar
- Execute um
SELECTcom o mesmoWHEREe verifique as linhas e a sua quantidade. - Depois execute o
UPDATEe compare o número de "linhas afetadas" com o resultado doSELECT.
-- 1. Que linhas vão mudar?
SELECT film_id, title, rental_rate
FROM film
WHERE rating = 'NC-17';
-- 2. Alterar exatamente essas linhas
UPDATE film
SET rental_rate = rental_rate + 1.00
WHERE rating = 'NC-17';
Em produção, execute as atualizações importantes dentro de uma transação, para que um erro possa ser revertido. O MySQL Workbench e o cliente MySQL também têm um modo "safe updates" que rejeita UPDATE e DELETE sem condição numa chave.
Principais conclusões:
UPDATE table SET column = value WHERE conditionaltera linhas existentes.- Sem
WHERE, todas as linhas da tabela são alteradas. - O
SETpode atribuir várias colunas e usar os seus valores atuais. - Para atualizar com base noutra tabela, use uma subconsulta no
WHEREou umUPDATEde várias tabelas; no MySQL, a subconsulta não pode ler a tabela atualizada. - Verifique primeiro as linhas com
SELECTe compare o número de linhas afetadas.
Perguntas Frequentes
O que acontece se eu executar UPDATE sem WHERE?
Todas as linhas da tabela são atualizadas. A única proteção é uma transação ainda não confirmada, um modo safe updates ou um backup. Verifique sempre a cláusula WHERE antes de executar um UPDATE.
Como atualizar várias colunas em SQL?
Liste-as no SET, separadas por vírgulas: UPDATE customer SET first_name = 'ALICE', last_name = 'COOPER' WHERE customer_id = 42;.
Como atualizar uma tabela com valores de outra tabela?
Use uma subconsulta no WHERE ou no SET, ou uma atualização de várias tabelas. No MySQL: UPDATE t1 JOIN t2 ON ... SET t1.col = t2.col WHERE ...; no PostgreSQL: UPDATE t1 SET col = t2.col FROM t2 WHERE t1.id = t2.id.