Я пропустил это! Спасибо!
я есть следующая таблица значений атрибутов сущности:
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. Интересно, почему это не используется в этом случае. Что мне здесь не хватает или какую ошибку я делаю?