Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SELECT last_value ... / 5 сообщений из 5, страница 1 из 1
22.11.2006, 16:42
    #34147585
Gnym
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT last_value ...
Здравствуйте, уважаемые гуру ;)
С 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
22.11.2006, 16:58
    #34147663
BlackDan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT last_value ...
Хм... у меня всё ок.
Код: 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
22.11.2006, 17:05
    #34147697
Gnym
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT last_value ...
У меня в 99.99% случаев тоже все ок, но бывает, что COUNT(*) выдает 0 :(
...
Рейтинг: 0 / 0
22.11.2006, 17:12
    #34147726
BlackDan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT last_value ...
надо юзать функцию 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
22.11.2006, 17:32
    #34147844
Gnym
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT last_value ...
Спасибо!
Исправил на SELECT currval(...).
Ждем-с результатов.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SELECT last_value ... / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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