Usando o Postgres 10.5, dado o seguinte:
postgres=# begin;
with updated as (update bippy set id = 100 where id = 1 returning 1)
select id, ts from bippy;
commit;
BEGIN
id | ts
----+-------------------------------
66 | 2019-07-09 10:42:32.062496-04
80 | 2019-07-09 10:43:28.068512-04
80 | 2019-07-09 10:43:28.596341-04
80 | 2019-07-15 14:42:32.062496-04
1 | 2019-07-09 10:42:23.142809-04
1 | 2019-07-09 10:42:25.366664-04
1 | 2019-07-09 10:42:26.142027-04
1 | 2019-07-09 10:42:26.702398-04
(8 rows)
COMMIT
Por que o acima retorna um id
of 1
em vez de 100
, ou seja, de acordo com a expressão de tabela comum?
Quando seleciono na tabela imediatamente depois, vejo que as atualizações ocorreram.
postgres=# select * from bippy;
ts | id
-------------------------------+-----
2019-07-09 10:42:32.062496-04 | 66
2019-07-09 10:43:28.068512-04 | 80
2019-07-09 10:43:28.596341-04 | 80
2019-07-15 14:42:32.062496-04 | 80
2019-07-09 10:42:23.142809-04 | 100
2019-07-09 10:42:25.366664-04 | 100
2019-07-09 10:42:26.142027-04 | 100
2019-07-09 10:42:26.702398-04 | 100
(8 rows)
Você precisa consultar o CTE e retornar * para ver os dados alterados.
Ou se você quiser que todas as linhas sejam retornadas (atualizadas e não atualizadas):
Da documentação:
7.8.2. Declarações de modificação de dados em WITH
As sub-instruções em WITH são executadas simultaneamente entre si e com a consulta principal. Portanto, ao usar instruções de modificação de dados em WITH, a ordem em que as atualizações especificadas realmente acontecem é imprevisível. Todas as instruções são executadas com o mesmo snapshot (veja o Capítulo 13), então elas não podem "ver" os efeitos umas das outras nas tabelas de destino. Isso alivia os efeitos da imprevisibilidade da ordem real das atualizações de linha e significa que RETURNING dados é a única maneira de comunicar alterações entre diferentes subinstruções WITH e a consulta principal. Um exemplo disso é que em
o SELECT externo retornaria os preços originais antes da ação do UPDATE, enquanto em
o SELECT externo retornaria os dados atualizados.