From: | Stephan Szabo <sszabo(at)megazone23(dot)bigpanda(dot)com> |
---|---|
To: | Frank Joerdens <frank(at)joerdens(dot)de> |
Cc: | <pgsql-sql(at)postgresql(dot)org> |
Subject: | Re: SELECT currval within a transaction |
Date: | 2002-03-06 19:23:34 |
Message-ID: | 20020306112228.R9719-100000@megazone23.bigpanda.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-sql |
On Wed, 6 Mar 2002, Frank Joerdens wrote:
> When inserting stuff I regularly come across the problem of wanting the
> value of the primary key row of the newly inserted row. In order to get
> it, I put the INSERT statement together with a SELECT currval into a
> transaction, like
>
> BEGIN WORK; INSERT INTO foo (bar) VALUES ('bla'); SELECT
> currval('foo_id_seq'); COMMIT WORK;
>
> My question is: Does this always work? My assumption obviously is that
> it does, i.e. that currval always returns the current value of the
> sequence as seen from within the transaction. It is conceivable
> (although I don't think it would make much sense) though that currval
> would return a different value if some other client did an insert right
> after the INSERT in the transaction (and currval would return a higher
> value). I don't believe it could be implemented that way because IMHO
> it'd break the whole notion of the atomicity of a transaction. But I'd
> like to be sure.
currval is defined to always return the value last given to your session,
so the only case you could have that fail that I see would be if a rule or
trigger invoked nextval on the sequence after the value was gotten for the
insert.
From | Date | Subject | |
---|---|---|---|
Next Message | Llew | 2002-03-06 19:27:45 | where not exists |
Previous Message | Stephan Szabo | 2002-03-06 18:20:42 | Re: simple problem |