在Postgres 10的分区表中使用onConflict子句插入多行

时间:2019-02-06 20:11:07

标签: 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 clause is not supported with partitioned tables

作为Postgres 10 doesn't support ON CONFLICT clauses on partitioned tables

  

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

如果我要插入一行,那么我可以尝试INSERT并在记录已存在的情况下通过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
       );

1 个答案:

答案 0 :(得分:1)

您最好的选择是升级到PostgreSQL v11,这将在其中起作用。

PostgreSQL v11在分区表上支持PRIMARY KEYUNIQUE约束(如果分区键是索引的一部分),这是INSERT ... ON CONFLICT的必要条件。