UPDATE [ ONLY ] tabela [ [ AS ] aliás ] SET { coluna = { expressão | DEFAULT } | ( coluna [, ...] ) = ( { expressão | DEFAULT } [, ...] ) } [, ...] [ FROM lista_do_from ] [ WHERE condição ] [ RETURNING * | expressão_de_saída [ AS nome_de_saída ] [, ...] ]
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.
A cláusula opcional RETURNING faz com que o comando UPDATE compute e retorne valores baseados em cada linha realmente atualizada. Pode ser computada qualquer expressão que utilize as colunas da tabela, e/ou colunas de outras tabelas mencionadas na cláusula FROM. São utilizados os novos valores (pós-atualização) das colunas da tabela. A sintaxe da lista da cláusula RETURNING é idêntica a da lista de saída do comando SELECT. [1]
É 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.
Um nome substituto para a tabela de destino. Quando é fornecido um aliás, o mesmo esconde inteiramente o nome verdadeiro da tabela. Por exemplo, dado UPDATE foo AS f, o restante do comando UPDATE deverá fazer referência a esta tabela como f, e não como foo.
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. Não deve ser incluído o nome da tabela na especificação da coluna de destino — por exemplo, UPDATE tab SET tab.col = 1 não é válido.
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.
Uma expressão a ser computada e retornada pelo comando UPDATE após cada linha ser atualizada. A expressão pode utilizar qualquer nome de coluna da tabela ou das tabelas listadas na cláusula FROM. Deve ser escrito * para retornar todas as colunas.
O nome a ser utilizado na coluna retornada.
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).
Se o comando UPDATE contiver a cláusula RETURNING, o resultado será semelhante ao do comando SELECT contendo as colunas e valores definidos na lista da cláusula RETURNING, computada sobre as linhas atualizadas pelo comando.
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';
Realizar a mesma operação e retornar as entradas atualizadas:
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' RETURNING temp_min, temp_max, precipitacao;
Utilizar a sintaxe alternativa de lista de coluna para realizar a mesma atualização:
UPDATE clima SET (temp_min, temp_max, precipitacao) = (temp_min+1, temp_min+15, 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 pelas cláusulas FROM e RETURNING que são extensões do PostgreSQL.
De acordo com o padrão, a sintaxe da lista de colunas deve permitir que sejam atribuídos valores a uma lista de colunas a partir de uma expressão de valor de uma única linha, como na subseleção:
UPDATE contas SET (ultimo_nome_contato, primeiro_nome_contato) = (SELECT ultimo_nome, primeiro_nome FROM vendedores WHERE vendedores.id_vendedor = contas.id_vendedor);
No momento está funcionalidade não se encontra implementada — a origem deve ser uma lista de expressões independentes.
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.
[1] |
SQL Server — A cláusula OUTPUT retorna informação sobre, ou expressões baseadas em, cada linha afetada por um comando INSERT, UPDATE ou DELETE. Estes resultados podem ser retornados para o aplicativo que está processando para uso em atividades como mensagens de confirmação, arquivamento, e outros requisitos do aplicativo. Como alternativa, os resultados podem ser inseridos em uma tabela ou em uma variável tabela. SQL Server 2005 Books Online — OUTPUT Clause (Transact-SQL) (N. do T.) |