Я пропустил это! Спасибо!

я есть следующая таблица значений атрибутов сущности:

CREATE TABLE key_value_pair (
    id serial NOT NULL PRIMARY KEY,
    key varchar(255) NOT NULL,
    value varchar(255),
    is_active boolean
);

CREATE UNIQUE INDEX key_value_pair_key_if_is_active_true_unique ON key_value_pair (key) WHERE is_active = true;

Примеры записей в этой таблице:

id |     key     | value | is_active 
----+-------------+-------+-----------
  1 | temperature | 2     | f
  2 | temperature | 12    | f
  3 | temperature | 15    | f
  4 | temperature | 19    | f
  5 | temperature | 23    | t
(5 rows)

Таким образом, в любой момент времени для любого данного ключа должна присутствовать только 1 истинная запись is_active.

Я запускаю следующий оператор upsert для этой таблицы:

INSERT INTO key_value_pair (key, value, is_active) VALUES ('temperature','20', true) 
ON CONFLICT (key, is_active)
DO UPDATE
SET value = '33', is_active = true;

Но это не так с:

ERROR:  there is no unique or exclusion constraint matching the ON CONFLICT specification

Мне интересно, почему он не использует уникальный частичный индексkey_value_pair_key_if_is_active_true_unique.

Апсерт работает, если я отпущу "в любой момент времени для любого данного ключа должна присутствовать только 1 истинная запись is_active"и измени индекс на:

CREATE UNIQUE INDEX key_value_pair_key_if_is_active_true_unique ON key_value_pair (key, is_active);

Я прочитал документацию на веб-сайте Postgres, что частичные индексы будут использоваться предложением ON CONFLICT. Интересно, почему это не используется в этом случае. Что мне здесь не хватает или какую ошибку я делаю?

Ответы на вопрос(1)

Ваш ответ на вопрос