ON CONFLICT ON CONSTRAINT fails saying constraint doesn't exist
-
02-10-2020 - |
Question
I'm trying to use new Postgresql 9.5 upsert feature. But for some reason my query saying constraint doesn't exist (when it does).
My query is this
INSERT INTO journals (ext_ids, title) VALUES ('{"nlmid": "000"}', 'blah')
ON CONFLICT ON CONSTRAINT idx_nlmid_journal DO NOTHING;
where idx_nlmid_journal
is unique index on jsonb field created like this
CREATE UNIQUE INDEX idx_nlmid_journal ON public.journals ((ext_ids ->> 'nlmid'::text));
I get error
ERROR: constraint "idx_nlmid_journal" for table "journals" does not exist
what am I missing ?
Solution
The syntax you use is not valid for a unique index because a unique index does not create a constraint. You need to remove the ON CONSTRAINT
and use the index expression instead.
This works:
INSERT INTO journals (ext_ids, title)
VALUES ('{"nlmid": "000"}', 'blah')
ON CONFLICT ((ext_ids ->> 'nlmid'::text))
DO NOTHING;
OTHER TIPS
I was getting the same issue. Here is my solution:
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
Licensed under: CC-BY-SA with attribution
Not affiliated with dba.stackexchange