Re: Avoiding a race condition - Mailing list pgsql-general

From Oliver Elphick
Subject Re: Avoiding a race condition
Date
Msg-id 1038071136.27507.427.camel@linda.lfix.co.uk
Whole thread Raw
In response to Avoiding a race condition  (MT <mt@open2web.com>)
List pgsql-general
On Sat, 2002-11-23 at 15:00, MT wrote:
> Earlier I wrote a note asking how I could insert a record and then
> display that record as verification that it had been successfully
> inserted. I got several suggestions, the following which I'd like to use:
>
> SELECT nextval('my_sequence') as id
>
> Then do the insert with the sequence and all other operations with the
> "id".
>
> I've tried to do this without success. Could someone show me the syntax
> since I can't figure it out.
>
> I've tried:
>
> SELECT nextval('prodid_seq') as id;
>
> INSERT INTO product VALUES (nextval('prodid_seq'),'...',...,'');
                              ^^^^^^^

That should be currval() or else you will increment the sequence twice.

> OK up to this point.

Not quite!

> Now how do I SELECT back the record I just inserted.
>
> SELECT * FROM product WHERE prodid = id;
> ERROR:  Attribute 'id' not found

SELECT * FROM product WHERE prodid = currval('prodid_seq');

>
> OK, I'm not very good at SQL yet. How do you put the sequence number in
> a place holder, then do the insert, and finally retrieve the record you
> just inserted by matching the prodid with the number in the place holder.

Just keep using currval() until you want to increment the sequence
again.

(If you're using a procedural language, you can store the output from
the first use of nextval() in a variable; then you can use that instead
of currval().)

--
Oliver Elphick <olly@lfix.co.uk>
LFIX Limited


pgsql-general by date:

Previous
From: MT
Date:
Subject: Avoiding a race condition
Next
From: Medi Montaseri
Date:
Subject: Re: Dumb Newbie Question - Mandrake 9.0 / PGSQL 7.2