У меня есть утверждение, подобное следующему в 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
);