@decenter

Как в postgresql реализвать конструкцию if update else insert?

Добрый день всем!
Что имеется?
есть условная таблица
CREATE TABLE public.company
(
    id integer DEFAULT nextval('company_id_seq'::regclass) NOT NULL,
   company_name varchar(125),
   inn varchar(32),
    kpp varchar(32),
    "check" varchar(65)  -- проверка уникальности, так как данные формируются из нескольких источников
);
CREATE UNIQUE INDEX company_check_uindex ON public.company ("check");


стоит задача реализовать некий аналог
INSERT INTO company ( company_name, inn, kpp, "check")  VALUES ('ООО рога и копыта', ''111, '222', '111-222')   ON CONFLICT (\"check\") DO UPDATE SET company_name = 'ООО рога и копыта',  inn='111', kpp='222',  RETURNING id;


При этом необходимо обойти "побочный эффект" увеличения id в случае обновления данных.

погуглив нашел несколько вариантов, наиболее подходящий их которых, на мой взгляд, является

DO
    $do$
    BEGIN
UPDATE SET company_name = 'ООО рога и копыта',  inn='111', kpp='222',  WHERE "check"='111-222'    RETURNING id;
    IF NOT FOUND THEN
INSERT INTO company ( company_name, inn, kpp, "check")  VALUES ('ООО рога и копыта', ''111, '222', '111-222')  RETURNING id;
    END IF;
    END
    $do$;


Однако данный вариант выдает ошибку.
ERROR: current transaction is aborted, commands ignored until end of transaction block [42601] ERROR: syntax error at or near "INTO

Подскажите в чем может быть загвоздка, или альтернативу решения вопроса с обходом вышеуказанного "побочного эффекта".

Заранее Спасибо!
  • Вопрос задан
  • 160 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы