UPDATE

Nome

UPDATE -- atualiza linhas de uma tabela

Sinopse

UPDATE [ ONLY ] tabela SET coluna = { expressão | DEFAULT } [, ...]
    [ FROM lista_do_from ]
    [ WHERE condição ]

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.

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

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.

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.

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

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';

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

SourceForge.net Logo CSS válido!