No PostgreSQL 9.5, dada uma tabela simples criada com:
create table tbl (
id serial primary key,
val integer
);
Eu corro o SQL para INSERT um valor e, em seguida, ATUALIZO na mesma instrução:
WITH newval AS (
INSERT INTO tbl(val) VALUES (1) RETURNING id
) UPDATE tbl SET val=2 FROM newval WHERE tbl.id=newval.id;
O resultado é que UPDATE é ignorado:
testdb=> select * from tbl;
┌────┬─────┐
│ id │ val │
├────┼─────┤
│ 1 │ 1 │
└────┴─────┘
Por que é isso? Essa limitação faz parte do padrão SQL (ou seja, presente em outros bancos de dados) ou é algo específico do PostgreSQL que pode ser corrigido no futuro? A documentação de consultas WITH diz que vários UPDATEs não são suportados, mas não menciona INSERTs e UPDATEs.