Re: INSERT ON CONFLICT RETURNING

From: Михаил <m(dot)nasedkin(at)gmail(dot)com>
To: Д(dot)П(dot) <aspamkiller(at)yandex(dot)ru>
Cc: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: INSERT ON CONFLICT RETURNING
Date: 2017-10-26 05:49:18
Message-ID: CALSKcLSoCDOa_m2=rA2wFnfTLGfY6zRJ=_cZNFRzPCyoJvjesw@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-ru-general

Доброго.

Сразу вернуть указание на дубликат у меня не получилось, но может так:

начал с этого:
insert into requests ( middleware_id ) values (1)
ON CONFLICT (middleware_id) DO update set middleware_id=EXCLUDED.middleware_id
returning id;
ошибок нет и нет указаний что вставки не произошло, тогда дальше:

insert into requests ( middleware_id ) values (1)
ON CONFLICT (middleware_id) DO update set
middleware_id=somefunc(EXCLUDED.middleware_id)
returning id;

функция somefunc(varchar), на ваше усмотрение, закидывает дубликат в
другую табличку и возвращает неизменное принятое на входе значение,
т.е. вставки не произойдет и insert вернет уже существующую запись.
Раз ошибки тоже не произошло. то вторым запросом проверяем дубляж в
этой маленькой табличке.

Решение не идеальное, примерно тоже самое, как перед вставкой делать
проверочный select * from public.requests where middleware_id=?; но
все же может поможет.

Успехов.

14.10.2017, Д.П.<aspamkiller(at)yandex(dot)ru> написал(а):
> И снова здравствуйте.
>
> Как бы мне извернуться, и узнать какое-нибудь поле из конфликтной
> записи, которого не было во вставке?
> То есть, грубо говоря
> я вставляю новую запись в таблицу
> # \d requests
>                                       Таблица "public.requests"
>     Столбец    |             Тип |                     Модификаторы
> ---------------+-----------------------------+-------------------------------------------------------
>  id            | bigint                      | NOT NULL DEFAULT
> nextval('requests_id_seq'::regclass)
>  middleware_id | character varying(1024)     |
>
> Индексы:
>     "requests_pkey" PRIMARY KEY, btree (id)
>     "requests_middleware_id_index" UNIQUE, btree (middleware_id)
>
> И вот такой командой оно мне, в случае конфликта middleware_id
> возвращает ровно ничего.
>
> > insert into requests ( middleware_id ) values (1) on conflict do
> nothing returning id;
>
>  id
> ----
> (0 строк)
>
> INSERT 0 0
>
> А я хочу id записи, или все поля записи.
>
> Или это невозможно и надо проверять результат и потом SELECT?
>
> В общем если добавить какое-то поле типа access_counter и ON CONFLICT DO
> UPDATE SET access_counter = access_counter + 1
> то, конечно, id вернётся, но планируется неплохая нагрузка на эту
> таблицу и не хочется добавлять.
>
> //ДП
>
>
>
> --
> Sent via pgsql-ru-general mailing list (pgsql-ru-general(at)postgresql(dot)org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-ru-general
>

--
---
С уважением,
Михаил Наседкин

In response to

Browse pgsql-ru-general by date

  From Date Subject
Next Message Dmitry E. Oboukhov 2017-10-26 07:56:55 Re: INSERT ON CONFLICT RETURNING
Previous Message Д.П. 2017-10-14 14:43:24 INSERT ON CONFLICT RETURNING