我有以下实体属性值表:
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个true is_active条目”的限制,并将索引更改为:
CREATE UNIQUE INDEX key_value_pair_key_if_is_active_true_unique ON key_value_pair (key, is_active);
我在Postgres网站上阅读的文档中看到,在ON CONFLICT子句中将使用部分索引。我想知道为什么在这种情况下没有使用它。我可能错过了什么,或者犯了什么错误?
varchar
列的例如200或345的限制相比没有任何优势。 - user330315