Postgresql 在Postgres 10的分区表中插入多个带有onConflict子句的行

Postgresql 在Postgres 10的分区表中插入多个带有onConflict子句的行,postgresql,partitioning,upsert,postgresql-10,Postgresql,Partitioning,Upsert,Postgresql 10,我在Postgres 10中有如下声明: INSERT INTO my_table(A, B) VALUES (val_A1, val_B1), ... (val_A99, val_B99) ON CONFLICT DO NOTHING; 这很好,但后来我对我的表进行了分区,然后该语句开始失败: org.postgresql.util.PSQLException: ERROR: ON CONFLICT cla

我在Postgres 10中有如下声明:

INSERT INTO my_table(A, B)
       VALUES (val_A1, val_B1),
              ...
              (val_A99, val_B99)
       ON CONFLICT DO NOTHING;
这很好,但后来我对我的表进行了分区,然后该语句开始失败:

org.postgresql.util.PSQLException: ERROR: 
ON CONFLICT clause is not supported with partitioned tables
作为研究生10:

对分区表使用ON CONFLICT子句将导致错误,因为只能在单个分区上创建唯一约束或排除约束。不支持在整个分区层次结构中强制唯一性或排除约束

如果我插入一行,我可以尝试插入,如果记录已经存在,我可以用try-catch控制错误

但是,由于我插入了多个值,除了这个值之外,我还有什么其他选择:

INSERT INTO my_table
       SELECT T.A, T.B
       FROM (VALUES(val_A1, val_B1), 
                   ...,
                   (val_A99, val_B99)) AS T(A, B),
       WHERE NOT EXISTS (
           SELECT 1 FROM my_table AS T2
                    WHERE T2.A = T.A
                      AND T2.B = T.B
       );

您最好的选择是升级到PostgreSQL v11,这样就可以了


如果分区键是索引的一部分,则PostgreSQL v11支持分区表上的主键和唯一约束,这是插入的必要条件。。。关于冲突。

我在RDS中使用Postgres,目前只支持10.6版。我看到他们正在努力支持版本11,但他们的部分仍然没有发布日期。最好的选择是使用。