UPDATE [ ONLY ] tabela SET coluna = { expressão | DEFAULT } [, ...] [ FROM lista_do_from ] [ WHERE condição ]
O comando UPDATE muda os valores das colunas especificadas em todas as linhas que satisfazem a condição. Somente precisam ser mencionadas na cláusula SET as colunas que serão modificadas; as colunas que não serão modificadas explicitamente manterão seus valores atuais.
Por padrão, o comando UPDATE atualiza linhas na tabela especificada e nas suas tabelas descendentes. Se for desejado atualizar apenas a tabela especificada, deverá ser utilizada a cláusula ONLY.
Existem duas maneiras de modificar uma tabela utilizando informações contidas em outras tabelas do banco de dados: usando subseleções, ou especificando tabelas adicionais na cláusula FROM. A técnica mais apropriada depende das circunstâncias específicas.
É necessário possuir o privilégio UPDATE na tabela para atualizá-la, assim como o privilégio SELECT em todas as tabelas cujos valores são lidos pela expressão ou pela condição.
O nome (opcionalmente qualificado pelo esquema) da tabela a ser atualizada.
O nome de uma coluna da tabela. O nome da coluna pode ser qualificado pelo nome de um subcampo ou índice de matriz, se for necessário.
Uma expressão a ser atribuída à coluna. A expressão pode usar o valor antigo desta e de outras colunas da tabela.
Define o valor da coluna como o seu valor padrão (que será nulo se não tiver sido atribuído à coluna nenhuma expressão padrão específica).
Uma lista de expressões de tabela, que permite aparecerem colunas de outras tabelas na condição WHERE e nas expressões de atualização. É semelhante à lista de tabelas que pode ser especificada na cláusula Cláusula FROM do comando SELECT. Deve ser observado que a tabela de destino não deve aparecer na lista_do_from, a menos que se deseje uma autojunção (neste caso deve aparecer com um aliás na lista_do_from).
Uma expressão que retorna um valor do tipo boolean. Somente são atualizadas as linhas para as quais esta expressão retorna true.
Ao terminar bem-sucedido, o comando UPDATE retorna uma linha de fim de comando na forma
UPDATE contador
O contador é o número de linhas atualizadas. Se contador for 0, nenhuma linha correspondeu à condição (o que não é considerado um erro).
Quando a cláusula FROM está presente o que acontece, essencialmente, é que é feita a junção da tabela de destino com as tabelas mencionadas na lista_do_from, e cada linha produzida pela junção representa uma operação de atualização para a tabela de destino. Quando se usa a cláusula FROM deve-se garantir que a junção produzirá, no máximo, uma linha de saída para cada linha a ser modificada. Em outras palavras, a linha de destino não deve ser juntada com mais de uma linha das outras tabelas, porque senão somente uma das linhas da junção será utilizada para atualizar a linha de destino, mas qual delas será utilizada não é imediatamente previsível.
Devido a esta indeterminação, é mais seguro fazer referência a outras tabelas somente dentro de subseleções, embora seja mais difícil de ler e mais lento do que a utilização da junção.
Mudar a palavra Drama para Dramático na coluna tipo da tabela filmes:
UPDATE filmes SET tipo = 'Dramático' WHERE tipo = 'Drama';
Ajustar as entradas de temperatura e redefinir a precipitação com seu valor padrão em uma linha da tabela clima:
UPDATE clima SET temp_min = temp_min+1, temp_max = temp_min+15, precipitacao = DEFAULT WHERE cidade = 'São Francisco' AND data = '2003-07-03';
Incrementar o contador de vendas do vendedor que gerencia a conta da Corporação Acme, usando a sintaxe da cláusula FROM:
UPDATE empregados SET contador_de_vendas = contador_de_vendas + 1 FROM contas WHERE contas.nome = 'Corporação Acme' AND empregados.id = contas.vendedor;
Realizar a mesma operação utilizando uma subseleção na cláusula WHERE:
UPDATE empregados SET contador_de_vendas = contador_de_vendas + 1 WHERE id = (SELECT vendedor FROM contas WHERE nome = 'Corporação Acme');
Tentar inserir um novo item no estoque junto com a quantidade em estoque. Se o item já existir, em vez inserir, atualizar o contador de estoque do item existente. Para fazer isto, sem interromper toda a transação, é utilizado um ponto de salvamento.
BEGIN; -- outras operações SAVEPOINT sp1; INSERT INTO vinhos VALUES('Chateau Lafite 2003', '24'); -- Assumindo que o comando acima falhou devido à violação de chave única, -- serão submetidos os comandos abaixo: ROLLBACK TO sp1; UPDATE vinhos SET estoque = estoque + 24 WHERE nome_do_vinho = 'Chateau Lafite 2003'; -- prosseguir com as outras operações e, finalmente, COMMIT;
Este comando está em conformidade com o padrão SQL, exceto pela cláusula FROM que é uma extensão do PostgreSQL.
Alguns outros sistemas de bancos de dados oferecem uma opção FROM onde se pressupõe que a tabela de destino será listada novamente dentro da cláusula FROM. O PostgreSQL não interpreta a cláusula FROM desta forma. Deve-se tomar cuidado ao portar aplicativos que utilizam esta extensão.