ON CONFLICT ON CONSTRAINT 失败,表示约束不存在

exp*_*ert 10 postgresql upsert postgresql-9.5

我正在尝试使用新的 Postgresql 9.5 upsert 功能。但出于某种原因,我的查询说约束不存在(当它存在时)。

我的查询是这样的

INSERT INTO journals (ext_ids, title) VALUES ('{"nlmid": "000"}', 'blah')
ON CONFLICT ON CONSTRAINT idx_nlmid_journal DO NOTHING;
Run Code Online (Sandbox Code Playgroud)

哪里idx_nlmid_journal是这样创造的jsonb领域唯一索引

CREATE UNIQUE INDEX idx_nlmid_journal ON public.journals ((ext_ids ->> 'nlmid'::text));
Run Code Online (Sandbox Code Playgroud)

我得到错误

ERROR: constraint "idx_nlmid_journal" for table "journals" does not exist
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

ype*_*eᵀᴹ 8

您使用的语法对唯一索引无效,因为唯一索引不会创建约束。您需要删除ON CONSTRAINT并改用索引表达式。

这有效:

INSERT INTO journals (ext_ids, title) 
VALUES ('{"nlmid": "000"}', 'blah')
ON CONFLICT ((ext_ids ->> 'nlmid'::text)) 
DO NOTHING;
Run Code Online (Sandbox Code Playgroud)

  • 好吧,语法_是_有效的,只是它必须引用约束,而不是索引。 (3认同)