有一个这样的表:
CREATE TABLE aggregated_master (
"user" BIGINT,
type TEXT,
date TIMESTAMP,
operations BIGINT,
amount NUMERIC,
PRIMARY KEY ( "user", type, date )
);
该表是从中继承许多分区的主表。分区由DATE字段中的MONTH完成。例如:2017年8月的分区将是agg_201708,它的PK将是pk_agg_201708。在插入之前,通常有触发器将插入重定向到适当的分区。
事情是我想对这张表做一个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)是主表上的约束,而不是将真正执行插入的子表上的约束。
我将CONFLICT条款更改为:
ON CONFLICT (user, type, date)
哪些是PK的字段,但这也不起作用。
任何想法如何使这项工作?
2
不要以为实施会受到限制。它应该真正检测到该错误。报告错误?
—
Craig Ringer
又见这个邮件列表线程postgresql.org/message-id/...
—
克雷格·林格