Postgresql

ON CONFLICT ON CONSTRAINT 失敗說約束不存在

  • May 9, 2020

我正在嘗試使用新的 Postgresql 9.5 upsert 功能。但由於某種原因,我的查詢說約束不存在(當它存在時)。

我的查詢是這個

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

我錯過了什麼?

您使用的語法對唯一索引無效,因為唯一索引不會創建約束。您需要刪除ON CONSTRAINT並改用索引表達式。

這有效:

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

我遇到了同樣的問題。這是我的解決方案:

CREATE TABLE messages_tags
(
   id SERIAL PRIMARY KEY,
   message_id INTEGER NOT NULL,
   tag_id INTEGER NOT NULL
);

ALTER TABLE messages_tags 
   ADD CONSTRAINT messages_tags_message_id_fkey FOREIGN KEY
   (
       message_id
   ) REFERENCES messages (
       id
   )
   ON UPDATE CASCADE
   ON DELETE CASCADE
;

ALTER TABLE messages_tags 
   ADD CONSTRAINT messages_tags_tag_id_fkey FOREIGN KEY
   (
       tag_id
   ) REFERENCES tags (
       id
   )
   ON UPDATE CASCADE
   ON DELETE CASCADE
;


CREATE UNIQUE INDEX idx_messages_tags ON messages_tags (message_id, tag_id);

ALTER TABLE messages_tags 
ADD CONSTRAINT unique_messages_tags 
UNIQUE
USING INDEX idx_messages_tags;

INSERT INTO messages_tags (message_id, tag_id) VALUES ($1, $2) ON CONFLICT  ON CONSTRAINT unique_messages_tags  DO NOTHING

引用自:https://dba.stackexchange.com/questions/139756