Re: currval() during one statement

Lists: Postg스포츠 토토SQL :
From: silly_sad <sad(at)bankir(dot)ru>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: currval() during one statement
Date: 2008-01-16 13:37:17
Message-ID: 478E088D.2080609@bankir.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

нормально ли что currval() возвращает разные значения вот в таком вызове:

INSERT INTO ttt (a,b) SELECT currval('ttt_id_seq'), 'const' FROM ttt2;

если триггер before insert on ttt вызывает nextval('ttt_id_seq')

Я вообще-то ожидал получить равное значение для всех выбираемых записей,
то которое было непосредственно перед этим запросом.


From: Andrew Boag <andrewb(at)catalyst(dot)net(dot)nz>
To: silly_sad <sad(at)bankir(dot)ru>
Cc: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: currval() during one statement
Date: 2008-01-16 20:52:59
Message-ID: 478E6EAB.40600@catalyst.net.nz
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: Postg스포츠 토토SQL :

sequence не "живет" польностью в транзации. они ведут себе как
глобальные значение в скрипте. то есть, если ROLLBACK сделаешь после
получения новых sequence значение, все равно этих значений уже не
получишь при повторнем вызове nextval(). не важно какая уровень
SERIALIZATION стоит

можно рассчитаться на то, что вызов nextval() даст тебе новое значение
(больше тем предыдущие) ... но с currval() надо аккуратно (может быть
concurrent transaction вызвал nextval() )

silly_sad wrote:
> нормально ли что currval() возвращает разные значения вот в таком вызове:
>
> INSERT INTO ttt (a,b) SELECT currval('ttt_id_seq'), 'const' FROM ttt2;
>
> если триггер before insert on ttt вызывает nextval('ttt_id_seq')
>
> Я вообще-то ожидал получить равное значение для всех выбираемых записей,
> то которое было непосредственно перед этим запросом.
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Have you searched our list archives?
>
> http://archives.postgresql.org
>


From: silly_sad <sad(at)bankir(dot)ru>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: currval() during one statement
Date: 2008-01-17 06:40:06
Message-ID: 478EF846.6030700@bankir.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

Andrew Boag wrote:
> sequence не "живет" польностью в транзации. они ведут себе как
> глобальные значение в скрипте.

Вот поэтому currval() и придуман ! чтобы жить в транзакции.
Если другая транзакция юзает nextval() то мой currval() не аффектится

> (больше тем предыдущие) ... но с currval() надо аккуратно (может быть
> concurrent transaction вызвал nextval() )

Вы не внимательно читали вопрос.
nextval() вызвал
триггер before insert on ttt

> silly_sad wrote:
>> нормально ли что currval() возвращает разные значения вот в таком вызове:
>>
>> INSERT INTO ttt (a,b) SELECT currval('ttt_id_seq'), 'const' FROM ttt2;
>>
>> если триггер before insert on ttt вызывает nextval('ttt_id_seq')
>>
>> Я вообще-то ожидал получить равное значение для всех выбираемых записей,
>> то которое было непосредственно перед этим запросом.