web-dev-qa-db-ja.com

ON CONFLICT ON CONSTRAINTは、制約が存在しないと言って失敗します

新しいPostgresql 9.5のアップサート機能を使用しようとしています。しかし、何らかの理由で、制約が存在しない(存在する場合)と言っている私のクエリ。

私の質問はこれです

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

どこ idx_nlmid_journalは、このように作成されたjsonbフィールドの一意のインデックスです

CREATE UNIQUE INDEX idx_nlmid_journal ON public.journals ((ext_ids ->> 'nlmid'::text));

エラーが出る

ERROR: constraint "idx_nlmid_journal" for table "journals" does not exist

何が欠けていますか?

5
expert

一意のインデックスは制約を作成しないため、使用する構文は一意のインデックスには無効です。 ON CONSTRAINTを削除して、代わりにインデックス式を使用する必要があります。

これは機能します:

INSERT INTO journals (ext_ids, title) 
VALUES ('{"nlmid": "000"}', 'blah')
ON CONFLICT ((ext_ids ->> 'nlmid'::text)) 
DO NOTHING;
5
ypercubeᵀᴹ