Recentemente me deparei com esse comportamento estranho no Postgres. Eu tinha uma tabela como a seguinte:
sasdb=# \d emp_manager_rel Tabela "db3004db.emp_manager_rel" Coluna | Tipo | Agrupamento | Anulável | Predefinição ------------+--------+-----------+----------+----- ---- emp_id | bigint | | | manager_id | bigint | | | selecione * de emp_manager_rel ; emp_id | manager_id --------+------------ 1 | 123
Executei a seguinte instrução de atualização:
ATUALIZAÇÃO 1:
atualizar emp_manager_rel set manager_id = manager_id+emp_id , emp_id=emp_id*4;
que atualizam a tabela como segue:
emp_id | manager_id --------+------------ 4 | 124
ATUALIZAÇÃO 2: Executei a seguinte consulta (na tabela original, não na atualizada)
atualizar emp_manager_rel set emp_id=emp_id*4 , manager_id = manager_id+emp_id ;
ele atualiza a tabela da seguinte forma:
emp_id | manager_id --------+------------ 4 | 124
Estou esperando que o valor de manager_id em UPDATE 2 seja 127 (porque emp_id foi alterado para 4 por empid * 4). Mas, ambas as ATUALIZAÇÕES produzem o mesmo resultado. Gostaria de saber qual será a ordem de execução da cláusula set no padrão ANSI.
Não há nada de "estranho" nesse comportamento - é a única maneira sensata de processar essa atualização.
Não existe "ordem de atualizações" - todas as cláusulas SET devem ser consideradas como ocorrendo em paralelo.
O padrão SQL requer que o lado direito da atribuição seja o valor das colunas como era antes do início da instrução UPDATE. A ordem na qual as atribuições de coluna são listadas na instrução UPDATE é irrelevante para o resultado da instrução UPDATE.
Qualquer outro comportamento da instrução UPDATE seria um bug e uma violação do padrão SQL.
Pelo mesmo motivo, a instrução a seguir trocará os valores das duas colunas:
ou