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,
t1
et2
), uma linha de destino emt1
pode se juntar com (ou seja, combinar) mais de uma linha na tabelat2
. 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
target
usando 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
target
atualizada para(0, 11)
(valores da linha com o valor mínimo parav
emsrc
) e nunca resultará em um erro.