⏳ Últimos dias de outubro! O SQLtest.online é gratuito graças às doações, e ainda precisamos atingir a meta deste mês para manter o site funcionando em novembro. Cada doação conta. Apoiar agora →
Código SQL copiado para a área de transferência

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.

SQL UPDATE: SET atribui novos valores, WHERE seleciona as linhas a alterar, e um UPDATE sem WHERE altera todas as linhas da tabela

Sintaxe do UPDATE

UPDATE table_name
SET column1 = value1,
    column2 = value2
WHERE condition;
  • UPDATE indica a tabela.
  • SET lista as colunas e os seus novos valores.
  • WHERE seleciona as linhas a alterar. Sem WHERE, 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

  1. Execute um SELECT com o mesmo WHERE e verifique as linhas e a sua quantidade.
  2. Depois execute o UPDATE e compare o número de "linhas afetadas" com o resultado do SELECT.
-- 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 condition altera linhas existentes.
  • Sem WHERE, todas as linhas da tabela são alteradas.
  • O SET pode atribuir várias colunas e usar os seus valores atuais.
  • Para atualizar com base noutra tabela, use uma subconsulta no WHERE ou um UPDATE de várias tabelas; no MySQL, a subconsulta não pode ler a tabela atualizada.
  • Verifique primeiro as linhas com SELECT e 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.

Tente resolver as tarefas a seguir para reforcar o que voce aprendeu nesta licao.

  1. Atualizar o código postal
  2. Realizar atualização de preço
  3. Atualizar custo de substituição
  4. Atualizar informações do projeto
  5. Atualizar Salários