powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SELECT last_value ...
5 сообщений из 5, страница 1 из 1
SELECT last_value ...
    #34147585
Gnym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, уважаемые гуру ;)
С PostgreSQL общаюсь недавно и потому возможно мой вопрос из разряда албанских, но вот какая ситуация, причины коей не понимаю, сложилась:

Выполняю последовательно следующие SQL-и:

BEGIN WORK;

INSERT INTO sometable (somefield) VALUES ('somevalue');

SELECT last_value FROM sometable_someid_seq;

^-- тут получаю значение last_value и выполняю следующий --V запрос:

SELECT COUNT(*) FROM sometable WHERE some_id = [полученный last_value]

результат - COUNT(*) = 0

Собственно 2 вопроса:
1. как такое может случиться ?
2. как избежать такого?
...
Рейтинг: 0 / 0
SELECT last_value ...
    #34147663
BlackDan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм... у меня всё ок.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
main=# begin work;
BEGIN
main=# create table test_seq (id serial, name varchar);
NOTICE:  CREATE TABLE will create implicit sequence "test_seq_id_seq" for serial column "test_seq.id"
CREATE TABLE
main=# insert into test_seq(name) values('test');
INSERT  0   1 
main=# select last_value from "test_seq_id_seq";
 last_value
------------
           1 
( 1  row)

main=# insert into test_seq(name) values('test');
INSERT  0   1 
main=# select last_value from "test_seq_id_seq";
 last_value
------------
           2 
( 1  row)

main=# select * from test_seq where id =  1 ;
 id | name
----+------
   1  | test
( 1  row)

main=# select * from test_seq where id =  2 ;
 id | name
----+------
   2  | test
( 1  row)

main=# select count(*) from test_seq where id =  2 ;
 count
-------
      1 
( 1  row)

main=# select count(*) from test_seq where id =  1 ;
 count
-------
      1 
( 1  row)

main=# rollback;
ROLLBACK
...
Рейтинг: 0 / 0
SELECT last_value ...
    #34147697
Gnym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня в 99.99% случаев тоже все ок, но бывает, что COUNT(*) выдает 0 :(
...
Рейтинг: 0 / 0
SELECT last_value ...
    #34147726
BlackDan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
надо юзать функцию currval("seq_name")
так как если ты обращаешься напрямую к последовательности, то в это время в другой транзакции эта последовательность может быть параллельно изменена.
А функция выдаёт тебе значение, которые было получено в твоей сессии.
авторReturn the value most recently obtained by nextval for this sequence in the current session. (An error is reported if nextval has never been called for this sequence in this session.) Notice that because this is returning a session-local value, it gives a predictable answer whether or not other sessions have executed nextval since the current session did.
...
Рейтинг: 0 / 0
SELECT last_value ...
    #34147844
Gnym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!
Исправил на SELECT currval(...).
Ждем-с результатов.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SELECT last_value ...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]