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> ]
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, - t1e- t2), uma linha de destino em- t1pode 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; 
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;
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 | +------------------------+-------------------------------------+
Com ERROR_ON_NONDETERMINISTIC_UPDATE = FALSE, a instrução atualiza aleatoriamente a única linha em
targetusando valores de uma das seguintes linhas emsrc:
(0, 11),(0, 12),(0,13)
Com ERROR_ON_NONDETERMINISTIC_UPDATE = TRUE, um erro é devolvido informando uma linha duplicada DML
[0, 10].
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;Esta instrução resulta na única linha em
targetatualizada para(0, 11)(valores da linha com o valor mínimo paravemsrc) e nunca resultará em um erro.