Вставка нескольких строк с предложением onConflict в многораздельную таблицу в Postgres 10 - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть утверждение, подобное следующему в 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 не поддерживает предложения ON CONFLICT для многораздельных таблиц :

Использование предложения 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 голосов
/ 06 февраля 2019

Лучшим вариантом является обновление до PostgreSQL v11, где это будет работать.

PostgreSQL v11 поддерживает ограничения PRIMARY KEY и UNIQUE для секционированных таблиц (если ключ секционирования является частью индекса),и это обязательное условие для INSERT ... ON CONFLICT.

...