Re: BUG #14909: nextval() bug
От | hubert depesz lubaczewski |
---|---|
Тема | Re: BUG #14909: nextval() bug |
Дата | |
Msg-id | 20171115112608.GA32070@depesz.com обсуждение исходный текст |
Ответ на | BUG #14909: nextval() bug (personal@rysmax.com) |
Список | pgsql-bugs |
On Wed, Nov 15, 2017 at 10:51:36AM +0000, personal@rysmax.com wrote: > CREATE TABLE "user" ( > id serial primary key not null, > email varchar(64) not null > ); > INSERT INTO "user" (id, email) VALUES ('1', 'admin@example.com'); > INSERT INTO "user" (id, email) VALUES ('2', 'user@example.com'); > > All done without errors. > > > > When i try to run the query bellow: > > INSERT INTO "user" (email) VALUES ('test@example.com'); > > and got the next error in pgAdmin and from the PHP: > > ERROR: duplicate key value violates unique constraint "user_pkey" > DETAIL: Key (id)=(1) already exists. > > but when i try to run this query 2 times the query executed without errors > on 3rd time. > I think this is a bug in nextval() function. No, it's not. when you insert providing value for id column, default (nextval) is not called, so sequence is not updated. So, when you finally try to insert without id, nextval is called and returns first unused (from the point of view of sequence) value - 1. Which already is in the table because you "forcibly" inserted it. To avoid this problem you have to either: 1. run setval(...) after insertiing data with some forced ids 2. always use nextval/default for id column. Best regards, depesz
В списке pgsql-bugs по дате отправления: