У меня есть хранимая процедура для выполнения upsert.Однако условие конфликта никогда не выполняется, передача существующего идентификатора всегда приводит к созданию новой записи.
create or replace function upsert_email(v_id bigint, v_subject character varying)
returns bigint
language plpgsql
as $$
declare
v_id bigint;
begin
insert into emails
(id, subject)
values (coalesce(v_id, (select nextval('serial'))), v_subject)
on conflict(id)
do update set (subject) = (v_subject) where emails.id = v_id
returning id into v_id;
return v_id;
end;
$$;
При запуске select upsert_email(6958500, 'subject');
, которая является существующей записью, она всегда создает новую запись.
Я уже смотрел на: Upsert / on конфликт с серийным первичным ключом , который является наиболее похожим вопросом и является тем, на чем смоделирован мой SQL, однако я не смог его получитьна работу.