Re: duplicate key violates unique constraint

From: Richard Huxton <dev(at)archonet(dot)com>
To: "ON(dot)KG" <skyer(at)on(dot)kg>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: duplicate key violates unique constraint
Date: 2005-06-13 14:43:41
Message-ID: 42AD9B9D.6080902@archonet.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general pgsql-sql

ON.KG wrote:
>
> before inserting or updating this table there're some checkings,
> logs, etc., so I'm using PL/PgSQL for that
>
> after all checkings and logs I have:
>
> UPDATE table1
> SET hits = hits + 1
> WHERE ip = some_ip;
>
> IF NOT FOUND THEN
> INSERT INTO table1
> (ip)
> VALUES
> (some_ip);
> END IF;
>
> when IP is not found in table it inserts new record into table
> but in logs i see error
> ERROR: duplicate key violates unique constraint "table1"
> CONTEXT: PL/pgSQL function "insert_table1" line 68 at SQL statement

If you can have more than one client running this at once you have a
race condition here. The order runs something like:
1. client A tries to update SOME_IP, no rows affected
2. client B tries to update SOME_IP, no rows affected
3. client A tries the insert of SOME_IP
4. client B tries the insert of SOME_IP - fails!

If you have more than one client, this can always happen. You have two
choices:
1. Use a lock to stop two clients interacting like this
2. Catch the error on the insert and try the update again. This
requires version 8.0 or higher.

--
Richard Huxton
Archonet Ltd

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Csaba Nagy 2005-06-13 14:45:41 Re: duplicate key violates unique constraint
Previous Message marcelo Cortez 2005-06-13 14:39:21 LOG: invalid message length

Browse pgsql-sql by date

  From Date Subject
Next Message Csaba Nagy 2005-06-13 14:45:41 Re: duplicate key violates unique constraint
Previous Message Tom Lane 2005-06-13 03:04:29 Re: predicate locking