Índice parcial não usado na cláusula ON CONFLICT ao executar uma upsert no Postgresql
Eu tenho a seguinte tabela de valor de atributo da entidade:
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;
As entradas de amostra nesta tabela são:
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)
Portanto, a qualquer momento, para qualquer chave especificada, apenas 1 entrada is_active verdadeira deve estar presente.
Estou executando a seguinte instrução upsert nesta tabela:
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;
Mas, falha com:
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
O que eu quero saber é por que ele não está usando o índice parcial exclusivokey_value_pair_key_if_is_active_true_unique.
O upsert funciona se eu largar o "a qualquer momento, para qualquer chave especificada, apenas 1 entrada is_active verdadeira deve estar presente"e altere o índice para:
CREATE UNIQUE INDEX key_value_pair_key_if_is_active_true_unique ON key_value_pair (key, is_active);
Li a documentação no site do Postgres de que índices parciais serão usados pela cláusula ON CONFLICT. Eu me pergunto por que não é usado neste caso. O que estou perdendo aqui ou que erro estou cometendo?