Tenha uma tabela como esta:
CREATE TABLE aggregated_master (
"user" BIGINT,
type TEXT,
date TIMESTAMP,
operations BIGINT,
amount NUMERIC,
PRIMARY KEY ( "user", type, date )
);
Esta tabela é o mestre do qual muitas partições são herdadas. As partições são feitas por MONTH no campo DATE. Por exemplo: A partição para agosto de 2017 seria agg_201708 e a PK seria pk_agg_201708 Há o gatilho usual ANTES DE INSERIR para redirecionar a inserção para a partição apropriada.
A questão é que eu quero fazer um UPSERT nesta tabela. A parte DO CONFLICT não está funcionando.
O código primeiro era assim
INSERT INTO aggregated_master (user, type, date, oeprations, amount)
SELECT user, type, date, SUM(ops), SUM(amt)
FROM ...
WHERE ...
GROUP BY USER, TYPE, DATE
ON CONFLICT ON CONSTRAINT pk_aggregated
DO UPDATE SET operations = EXCLUDED.operations
, amount = EXCLUDED.amount
Mas notei que a restrição (pk_aggregated) é a da tabela mestre, e não da tabela filha em que a inserção será realmente executada, devido ao gatilho.
Alterei a cláusula CONFLICT para:
ON CONFLICT (user, type, date)
Quais são os campos do PK, mas isso também não funciona.
Alguma idéia de como fazer isso funcionar?
postgresql
plpgsql
upsert
Sergi Porta
fonte
fonte
Respostas:
O PostgreSQL 11 suporta
INSERT INTO ... ON CONFLICT
com tabelas particionadas:DBFiddle Demo
Limitação ddl-particionamento
foi levantado.
fonte
Upsert em tabelas particionadas não é implementado em versões anteriores ao Postgres 11.
No Postgres 9.6:
O particionamento declarativo não resolve o problema, Postgres 10:
Gambiarra
("user", type, date)
em todas as tabelas filho,No Postgres 11 você pode usar
ON CONFLICT
em tabelas particionadas, veja a resposta do lad2025.fonte