gpt4 book ai didi

postgresql - 在 Postgresql 中执行更新插入时,ON CONFLICT 子句中未使用部分索引

转载 作者:行者123 更新时间:2023-11-29 13:43:49 24 4
gpt4 key购买 nike

我有以下实体属性值表:

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 子句使用的文档。我想知道为什么在这种情况下不使用它。我在这里错过了什么,或者我犯了什么错误?

最佳答案

您必须使用索引谓词才能使用部分唯一索引。阅读 the documentation:

index_predicate

Used to allow inference of partial unique indexes. Any indexes that satisfy the predicate (which need not actually be partial indexes) can be inferred. Follows CREATE INDEX format.

在这种情况下:

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

关于postgresql - 在 Postgresql 中执行更新插入时,ON CONFLICT 子句中未使用部分索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51551569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com