Postgresql
ON CONFLICT ON CONSTRAINT 失敗說約束不存在
我正在嘗試使用新的 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