Обсуждение: Current value of a sequence?
I'm trying to find the next value that will be assigned by a sequence
without actually incrementing it (yes, I know it isn't atomic-safe
and all)
I had a lot of trouble finding information about sequences in
the current documentation (maybe it is in the A4 PDF version or
something). When I finally resorted to trolling through the
source code, and found currval, it seems to have an odd (IMHO)
behavior:
zipcode=# select currval('messages_pkey_seq');
ERROR: messages_pkey_seq.currval is not yet defined in this session
...however, if I select nextval() first, it works. Is this
lazy caching? Is there a good way to find the current value of
sequence without querying directly (and possibly breaking in
future implementations?)
--
Adam Haberlach | At either end of the social spectrum there lies
adam@newsnipple.com | a leisure class. -- Eric Beck 1965
http://www.newsnipple.com |
'88 EX500 '00 >^< | http://youlook.org
Adam Haberlach <adam@newsnipple.com> writes:
> I'm trying to find the next value that will be assigned by a sequence
> without actually incrementing it (yes, I know it isn't atomic-safe
> and all)
If you aren't very concerned about cross-transaction safety,
select last_value + increment_by from seq;
is approximately right.
There is a *lot* of discussion about this in the mailing list archives.
regards, tom lane
this is a faq (i know, i asked it at least twice...:) --
On Sun, Jun 03, 2001 at 12:34:22PM -0700, Adam Haberlach wrote:
> I'm trying to find the next value that will be assigned by a sequence
> without actually incrementing it (yes, I know it isn't atomic-safe
> and all)
>
> I had a lot of trouble finding information about sequences in
> the current documentation (maybe it is in the A4 PDF version or
> something). When I finally resorted to trolling through the
> source code, and found currval, it seems to have an odd (IMHO)
> behavior:
>
> zipcode=# select currval('messages_pkey_seq');
> ERROR: messages_pkey_seq.currval is not yet defined in this session
>
> ...however, if I select nextval() first, it works. Is this
> lazy caching? Is there a good way to find the current value of
> sequence without querying directly (and possibly breaking in
> future implementations?)
usually what you're trying to do is insert a record in tableA
that has a sequence, and then also insert some referring records
into tableB and tableC -- in which case insert to tableA first,
then
insert into tableA(...) values (...);
insert into tableB(..., tableArefID, ...)
values (..., currval(seq), ...)
insert into tableC(..., tableArefID, ...)
values (..., currval(seq), ...)
the reason is, as you say, "atomic-safe and all" -- if you do
select last_value+increment_by from seq;
another parallell process could bump the counter before you have
a chance to use it. this ultimately leads to Bad Things.
--
#95: We are waking up and linking to each other. We are watching. But
we are not waiting. -- www.cluetrain.com
will@serensoft.com
http://sourceforge.net/projects/newbiedoc -- we need your brain!
http://www.dontUthink.com/ -- your brain needs us!
On Sun, 3 Jun 2001 19:48:42 +0000 (UTC), Adam Haberlach <adam@newsnipple.com>:
> zipcode=# select currval('messages_pkey_seq');
> ERROR: messages_pkey_seq.currval is not yet defined in this session
>
> ...however, if I select nextval() first, it works. Is this
> lazy caching? Is there a good way to find the current value of
> sequence without querying directly (and possibly breaking in
> future implementations?)
This is the way sequences are supposed to work.
currval is the current value of the sequence as seen
by the current session. That's why it is not defined
until you select nextval first.
Remember that a sequence is not guaranteed to not
have spaces...
If you want to find the last number from the sequence
which was inserted in to a table, you should select max()
on that column.