Avere un tavolo come questo:
CREATE TABLE aggregated_master (
"user" BIGINT,
type TEXT,
date TIMESTAMP,
operations BIGINT,
amount NUMERIC,
PRIMARY KEY ( "user", type, date )
);
Questa tabella è il master da cui ereditano molte partizioni. Le partizioni vengono eseguite da MONTH nel campo DATA. Ad esempio: la partizione per agosto 2017 sarebbe agg_201708 e PK sarebbe pk_agg_201708 Esiste il solito trigger PRIMA DI INSERIRE per reindirizzare l'inserto alla partizione corretta.
Il fatto è che voglio fare un UPSERT in questa tabella. La parte DO CONFLICT non funziona.
Il codice prima era così
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
Ma poi ho notato che il vincolo (pk_aggregated) è quello sulla tabella principale e non sulla tabella figlio in cui verrà effettivamente eseguito l'inserimento, a causa del trigger.
Ho modificato la clausola CONFLICT in:
ON CONFLICT (user, type, date)
Quali sono i campi del PK, ma neanche questo funziona.
Qualche idea su come farlo funzionare?