Re: next integer in serial key

Поиск
Список
Период
Сортировка
От Oliver Elphick
Тема Re: next integer in serial key
Дата
Msg-id 1090498526.5446.9.camel@braydb
обсуждение исходный текст
Ответ на Re: next integer in serial key  (<terry@ashtonwoodshomes.com>)
Ответы Re: next integer in serial key
Re: next integer in serial key
Список pgsql-sql
On Thu, 2004-07-22 at 12:48, terry@ashtonwoodshomes.com wrote:
> Actually it does work, call nextval to get your next value, then call
> your INSERT statement,
> explicitly giving said value for the serial column.  Then you can
> proceed with using said value in
> the INSERT statement of the related inserts with foreign keys to it.
> 
> Alternatively, you can do:
> INSERT  (accepting the default)
> then SELECT currval(the_sequence_object);
> then <extra inserts of related foreign key records>
> 
> NOTE: 2nd method assumes that nobody else called nextval() on the
> sequence between when you did the
> insert and when you did the select currval().  Note that being inside
> a transaction is NOT
> sufficient, you need an explicit lock on the sequence.  I do not
> recommend the 2nd method, too much
> can go wrong.

This last paragraph is wrong and irrelevant.  It is a point which for
some reason is continually being misunderstood.

currval() *always* returns the last value generated for the sequence in
the *current session*.  It is specifically designed to do what you are
suggesting without any conflict with other sessions.  There is *never*
any risk of getting a value that nextval() returned to some other user's
session.

The downside is that it operates outside the transaction and therefore
cannot be rolled back.  It is also necessary to run nextval() in the
session (either explicitly or by letting a serial column take its
default) before you can use currval() on the sequence.

Oliver Elphick



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

Предыдущее
От:
Дата:
Сообщение: Re: next integer in serial key
Следующее
От: Karsten Hilbert
Дата:
Сообщение: Re: surrogate key or not?