Thread: [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
Доброго. Сразу вернуть указание на дубликат у меня не получилось, но может так: начал с этого: 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
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
> 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