Есть стол, как это:
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)
Какие поля ПК, но это тоже не работает.
Есть идеи, как заставить это работать?
postgresql
plpgsql
upsert
Серги Порта
источник
источник
Ответы:
PostgreSQL 11 поддерживает
INSERT INTO ... ON CONFLICT
с секционированными таблицами:DBFiddle Demo
Ограничение ddl-разбиения
был отменен
источник
Upsert для многораздельных таблиц не реализован в версиях, предшествующих Postgres 11.
В Postgres 9.6:
Декларативное разбиение не решает проблему, Postgres 10:
Временное решение
("user", type, date)
для всех дочерних таблиц,В Postgres 11 вы можете использовать
ON CONFLICT
разделенные таблицы, см . Ответ lad2025.источник