UPDATE

Nome

UPDATE -- atualiza linhas de uma tabela

Sinopse

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 ] [, ...] ]

Descriçã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.

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.

Parâmetros

tabela

O nome (opcionalmente qualificado pelo esquema) da tabela a ser atualizada.

aliás

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.

coluna

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.

expressão

Uma expressão a ser atribuída à coluna. A expressão pode usar o valor antigo desta e de outras colunas da tabela.

DEFAULT

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).

lista_do_from

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).

condição

Uma expressão que retorna um valor do tipo boolean. Somente são atualizadas as linhas para as quais esta expressão retorna true.

expressão_de_saída

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.

nome_de_saída

O nome a ser utilizado na coluna retornada.

Saídas

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.

Observações

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.

Exemplos

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;

Compatibilidade

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.

Notas

[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.)

SourceForge.net Logo CSS válido!