Обсуждение: [pgsql-ru-general] INSERT ON CONFLICT RETURNING

Поиск
Список
Период
Сортировка

[pgsql-ru-general] INSERT ON CONFLICT RETURNING

От
Д.П.
Дата:
И снова здравствуйте.

Как бы мне извернуться, и узнать какое-нибудь поле из конфликтной 
записи, которого не было во вставке?
То есть, грубо говоря
я вставляю новую запись в таблицу
# \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@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-ru-general

Re: [pgsql-ru-general] INSERT ON CONFLICT RETURNING

От
Михаил
Дата:
Доброго.

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

начал с этого:
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@yandex.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@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-ru-general
>


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

--
Sent via pgsql-ru-general mailing list (pgsql-ru-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-ru-general

Re: [pgsql-ru-general] INSERT ON CONFLICT RETURNING

От
"Dmitry E. Oboukhov"
Дата:
WITH "r" AS (   INSERT INTO ...        ON CONFLICT ... DO NOTHING
       RETURNING *
)
SELECT   *
FROM   ...
WHERE   id = $id   AND NOT EXISTS (SELECT * FROM "r")

UNION

SELECT   *
FROM   "r"
;

как-то так

вернет вставленную/uptate'ную запись или имеющуюся

On 17:43 Sat 14 Oct     , Д.П. wrote:
> И снова здравствуйте.

> Как бы мне извернуться, и узнать какое-нибудь поле из конфликтной записи,
> которого не было во вставке?
> То есть, грубо говоря
> я вставляю новую запись в таблицу
> # \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@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-ru-general
--

. ''`.            Dmitry E. Oboukhov <unera@debian.org>
: :’  :
`. `~’               GPG key: 4096R/08EEA756 2014-08-30 `- 71ED ACFC 6801 0DD9 1AD1  9B86 8D1F 969A 08EE A756

Re: [pgsql-ru-general] INSERT ON CONFLICT RETURNING

От
"Dmitry E. Oboukhov"
Дата:
> WITH "r" AS (
> INSERT INTO ...
> ON CONFLICT ... DO NOTHING

> RETURNING *
> )
> SELECT
> *
> FROM
> ...
> WHERE
> id = $id
> AND NOT EXISTS (SELECT * FROM "r")

> UNION

> SELECT
> *
> FROM
> "r"
> ;

> как-то так

> вернет вставленную/uptate'ную запись или имеющуюся

а ну еще LIMIT 1 вкрутить, если лишний хвост в выдаче не нужен

> On 17:43 Sat 14 Oct     , Д.П. wrote:
>> И снова здравствуйте.

>> Как бы мне извернуться, и узнать какое-нибудь поле из конфликтной записи,
>> которого не было во вставке?
>> То есть, грубо говоря
>> я вставляю новую запись в таблицу
>> # \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@postgresql.org)
>> To make changes to your subscription:
>> http://www.postgresql.org/mailpref/pgsql-ru-general
> --

> . ''`.            Dmitry E. Oboukhov <unera@debian.org>
> : :’  :
> `. `~’               GPG key: 4096R/08EEA756 2014-08-30
> `- 71ED ACFC 6801 0DD9 1AD1  9B86 8D1F 969A 08EE A756
--

. ''`.            Dmitry E. Oboukhov <unera@debian.org>
: :’  :
`. `~’               GPG key: 4096R/08EEA756 2014-08-30 `- 71ED ACFC 6801 0DD9 1AD1  9B86 8D1F 969A 08EE A756