Как закрепить серийный первичный ключ - PullRequest
0 голосов
/ 24 октября 2018

У меня есть хранимая процедура для выполнения 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, однако я не смог его получитьна работу.

1 Ответ

0 голосов
/ 24 октября 2018

Ух ты, мне присуждается награда "Идиот года".

Я беру параметр v_id, а затем сразу перезаписываю его в объявлении с v_id;Они должны называться 2 разными вещами:

create or replace function upsert_email(v_id bigint, v_subject character varying)
  returns bigint
language plpgsql
as $$
declare
  v_return_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_return_id;

  return v_return_id;
end;
$$;
...