<div>Привет</div><div>Это задокументированное поведение, поэтому точно не баг: https://www.postgresql.org/docs/9.6/static/sql-insert.html</div><div>> Only rows that were successfully inserted or updated will be returned.</div><div> </div><div>С предложением по изменению поведения - сначала имеет смысл найти обсуждение этой фичи в pgsql-hackers и почитать, какие были доводы в пользу именно такого поведения (я тогда ещё не следил за списками рассылок, не знаю).</div><div> </div><div>Сергей</div><div><br /></div><div><br /></div><div>15.08.2018, 17:50, "Warstone(at)list(dot)ru" <warstone(at)list(dot)ru>:</div><blockquote type="cite">
<p>=> CREATE TABLE test (<br /> id BIGSERIAL NOT NULL PRIMARY KEY,<br /> name TEXT NOT NULL UNIQUE,<br /> value TEXT<br />);<br />CREATE TABLE<br /><br />=> INSERT INTO test (name, value) VALUES ('test', '1');<br />INSERT 0 1<br /><br />=> INSERT INTO test (name, value) VALUES ('test', '1');<br />ERROR: duplicate key value violates unique constraint "test_name_key"<br />DETAIL: Key (name)=(test) already exists.<br /><br />=> INSERT INTO test (name, value) VALUES ('test', '1') ON CONFLICT DO NOTHING;<br />INSERT 0 0<br /><br />=> INSERT INTO test (name, value) VALUES ('test', '1') ON CONFLICT DO NOTHING RETURNING id;<br /> id<br />----<br />(0 rows)<br /><br />=> INSERT INTO test (name, value) VALUES ('test', '1') ON CONFLICT (name) DO UPDATE SET name = 'test' RETURNING id;<br /> id<br />----<br /> 1<br />(1 row)<br /><br />INSERT 0 1</p><p><br data-mce-bogus="1" /></p><p>=> SELECT version();<br /> version<br />---------------------------------------------------------------------------------------------------<br /> PostgreSQL 9.6.6 on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18) 6.3.<span>0 20170516</span>, 64-bit<br />(1 row)<br /><br /><br /><br />Куда писать чтобы и в случае DO NOTHING id возвращался?.. Так как кажется - баг.<br /></p>
</blockquote>