Есть стол, как это:
CREATE TABLE aggregated_master (
"user" BIGINT,
type TEXT,
date TIMESTAMP,
operations BIGINT,
amount NUMERIC,
PRIMARY KEY ( "user", type, date )
);
Эта таблица является мастером, от которого наследуется множество разделов. Разделы выполняются MONTH в поле DATE. Например: раздел для августа-2017 будет agg_201708, а его PK будет pk_agg_201708. Существует обычный триггер BEFORE INSERT для перенаправления вставки в соответствующий раздел.
Дело в том, что я хочу сделать UPSERT в эту таблицу. Часть DO CONFLICT не работает.
Код сначала был такой
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
Но затем я заметил, что ограничение (pk_aggregated) - это ограничение в главной таблице, а не в дочерней таблице, где действительно будет выполняться вставка, из-за триггера.
Я изменил пункт КОНФЛИКТ:
ON CONFLICT (user, type, date)
Какие поля ПК, но это тоже не работает.
Есть идеи, как заставить это работать?