UPDATE

Atualiza as linhas especificadas na tabela de destino com novos valores.

Sintaxe

UPDATE <target_table>
       SET <col_name> = <value> [ , <col_name> = <value> , ... ]
        [ FROM <additional_tables> ]
        [ WHERE <condition> ]
Copy

Parâmetros obrigatórios

target_table

Especifica a tabela a ser atualizada.

col_name

Especifica o nome de uma coluna em target_table. Não inclua o nome da tabela. Por exemplo, UPDATE t1 SET t1.col = 1 é inválido.

value

Especifica o novo valor a ser definido em col_name.

Parâmetros opcionais

FROM additional_tables

Especifica uma ou mais tabelas a serem usadas para selecionar linhas a serem atualizadas ou para definir novos valores. Note que a repetição da tabela de destino resulta em uma autojunção.

WHERE condition

Expressão que especifica as linhas na tabela de destino a serem atualizadas.

Padrão: sem valor (todas as linhas da tabela de destino são atualizadas)

Notas de uso

  • Quando uma cláusula FROM contém um JOIN entre tabelas (por exemplo, t1 e t2), uma linha de destino em t1 pode se juntar com (ou seja, combinar) mais de uma linha na tabela t2. Quando isso ocorre, a linha de destino é chamada de linha de junção múltipla. Ao atualizar uma linha com várias junções, o parâmetro de sessão ERROR_ON_NONDETERMINISTIC_UPDATE controla o resultado da atualização:

    • Se FALSE (valor padrão), nenhum erro é retornado e uma das linhas unidas é usada para atualizar a linha de destino; no entanto, a linha unida selecionada é não determinística.

    • IF TRUE, um erro é retornado, incluindo um exemplo dos valores de uma linha de destino que une várias filas.

    Para definir o parâmetro:

    ALTER SESSION SET ERROR_ON_NONDETERMINISTIC_UPDATE=TRUE;
    
    Copy

Exemplos

Executar uma atualização padrão utilizando duas tabelas:

UPDATE t1
  SET number_column = t1.number_column + t2.number_column, t1.text_column = 'ASDF'
  FROM t2
  WHERE t1.key_column = t2.t1_key and t1.number_column < 10;
Copy

Atualizar com junção que produz resultados não determinísticos:

select * from target;

+---+----+
| K |  V |
|---+----|
| 0 | 10 |
+---+----+

Select * from src;

+---+----+
| K |  V |
|---+----|
| 0 | 11 |
| 0 | 12 |
| 0 | 13 |
+---+----+

-- Following statement joins all three rows in src against the single row in target
UPDATE target
  SET v = src.v
  FROM src
  WHERE target.k = src.k;

+------------------------+-------------------------------------+
| number of rows updated | number of multi-joined rows updated |
|------------------------+-------------------------------------|
|                      1 |                                   1 |
+------------------------+-------------------------------------+
Copy

Para evitar este comportamento não determinístico e este erro, use uma junção 1 para 1:

UPDATE target SET v = b.v
  FROM (SELECT k, MIN(v) v FROM src GROUP BY k) b
  WHERE target.k = b.k;
Copy

Esta instrução resulta na única linha em target atualizada para (0, 11) (valores da linha com o valor mínimo para v em src) e nunca resultará em um erro.