Re: Duplicate Unique Key constraint error

Поиск
Список
Период
Сортировка
От Harpreet Dhaliwal
Тема Re: Duplicate Unique Key constraint error
Дата
Msg-id d86a77ef0707101122y2e2b4ed6icc1514ea730715f6@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Duplicate Unique Key constraint error  ("Harpreet Dhaliwal" <harpreet.dhaliwal01@gmail.com>)
Ответы Re: Duplicate Unique Key constraint error  (Michael Glaesemann <grzm@seespotcode.net>)
Re: Duplicate Unique Key constraint error  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-general
I lately figured out the actual problem PHEW.
Its something like two different transactions are seeing the same snapshot of the database.

Transaction 1 started, saw max(dig_id) = 30 and inserted new dig_id=31.
Now the time when Transaction 2 started and read max(dig_id) it was still 30 and by the time it tried to insert 31, 31 was already inserted by Transaction 1 and hence the unique key constraint error.

I thought this would be taken care by the database itself by locking the transactions but now I really don't know how does this locking takes place in postgres. I used to work with SQL Server and never faced this problem there.

Please guide me throug to get rid of this problem.

Thanks,
~Harpreet

On 7/10/07, Harpreet Dhaliwal < harpreet.dhaliwal01@gmail.com> wrote:
my primary key is neither SERIAL nor a SEQUENCE.

CONSTRAINT pk_dig PRIMARY KEY (dig_id)

This is the clause that I have for my primary key in the create table script.

thanks,
~Harpreet

On 7/10/07, Ron St-Pierre < ron.pgsql@shaw.ca> wrote:
Harpreet Dhaliwal wrote:
> Hi,
>
> I keep getting this duplicate unique key constraint error for my
> primary key even
> though I'm not inserting anything duplicate. It even inserts the
> records properly
> but my console throws this error that I'm sure of what it is all about.
>
> Corruption of my Primary Key can be one of the possibilities but I'm
> really not sure how
> to get rid of this corruption and how to re-index the primary key.
>
> Also, I was wondering what could be the cause of this PK  corruption,
> if possible and what does can this corruption lead to.
> I mean what are its cons.
>
> Thanks,
> ~Harpreet
You haven't really given any useful information about your primary key,
but if you are using SERIAL as the column type (INT type with a
sequence) you may just be having a problem with its current value (but
then inserts shouldn't work).

If you are using a sequence here, see what it's current value is and
compare it to the highest value in the column. If its value is less than
the columns max() value, just reset the value in the sequence.

imp=# CREATE TABLE dup_pkey (id SERIAL PRIMARY KEY, insert_order int);
imp=# INSERT INTO dup_pkey (insert_order) VALUES (1);
imp=# INSERT INTO dup_pkey (insert_order) VALUES (2);
imp=# INSERT INTO dup_pkey (insert_order) VALUES (3);
imp=# INSERT INTO dup_pkey (insert_order) VALUES (4);

imp=# SELECT * FROM dup_pkey;
id | insert_order
----+--------------
  1 |            1
  2 |            2
  3 |            3
  4 |            4
(4 rows)

Now, if you set the value below what the max() column value is, you will
have a problem with inserts.
imp=# SELECT setval('dup_pkey_id_seq',3);
setval
--------
      3
(1 row)

imp=# INSERT INTO dup_pkey (insert_order) VALUES (5);
ERROR:  duplicate key violates unique constraint "dup_pkey_pkey"


If this is the case, use setval() to update the value of the sequence to
the max() value of your primary key. You can use \d to get information
about your table, including the sequence name. However if, as you say,
it IS inserting records properly, then this ISN'T going to help.

hth

Ron


В списке pgsql-general по дате отправления:

Предыдущее
От: Mario Guenterberg
Дата:
Сообщение: Re: Postgres 8.2 binary for ubuntu 6.10?
Следующее
От: Michael Glaesemann
Дата:
Сообщение: Re: Duplicate Unique Key constraint error