Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / узнать id добавленной записи или максимальное значение oid / 21 сообщений из 21, страница 1 из 1
02.06.2005, 17:17
    #33097991
джанкер
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
я использую oid для определения id добавленных записей в таблицы
и знаю что при достижении oid = MAX он сбрасывается на 0 и начинается новый отсчёт
при этом ведь может получиться так что в одной таблице окажутся несколько записей с одинаковым oid

как этого избежать?
...
Рейтинг: 0 / 0
02.06.2005, 17:25
    #33098017
Meta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
джанкеря использую oid для определения id добавленных записей в таблицы
и знаю что при достижении oid = MAX он сбрасывается на 0 и начинается новый отсчёт
при этом ведь может получиться так что в одной таблице окажутся несколько записей с одинаковым oid

как этого избежать?

Используешь в корне неверное решение, отсюда и проблемы.
авторOIDs are best used only for references to system tables.
IMHO придётся переделывать систему :)
...
Рейтинг: 0 / 0
02.06.2005, 17:34
    #33098046
PaF
PaF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
Хорошо. И всетаки как можно получить значение клучевого поля только что добавленной записи? (поле автоинкримент)
...
Рейтинг: 0 / 0
02.06.2005, 17:51
    #33098096
джанкер
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
может быть так?:

Код: plaintext
1.
2.
3.
4.
BEGIN;
INSERT INTO tbl (a,b,c) VALUES ( 1 , 2 , 3 );
SELECT MAX(id) FROM tbl;
COMMIT;

или делать инсерты через ХП
...
Рейтинг: 0 / 0
02.06.2005, 18:12
    #33098162
wbear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
select currval('seq_name')

автоинкремент поле создает автоматом сиквенс с именем TableName_FieldName_seq

в доках все это есть
...
Рейтинг: 0 / 0
02.06.2005, 18:45
    #33098229
джанкер
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
wbearselect currval('seq_name')

автоинкремент поле создает автоматом сиквенс с именем TableName_FieldName_seq

в доках все это есть

а как насчёт выполнения некоторого количества инсертов несколькими пользователями?

при таком раскладе юзер вася может получить id записи которую добавил петя
и зачем она нужна васе?

ВАСЕ НАДО УЗНАТЬ id СОБСТВЕННОРУЧНО ДОБАВЛЕННОЙ ЗАПИСИ
...
Рейтинг: 0 / 0
02.06.2005, 18:53
    #33098245
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
Всё продумано:
PostgreSQL docs
currval
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.

Так что юзер вася НЕ может получить id записи которую добавил петя :)
Хотя я обычно через ХП:
Код: plaintext
1.
2.
3.
4.
5.
6.
create function insert_new_record(_data some_type) returns bigint as $$
BEGIN
  insert into data_t (id, data) values (nextval('data_seq'), _data);
  return currval('data_seq');
END
$$ language 'plpgsql';
...
Рейтинг: 0 / 0
03.06.2005, 00:07
    #33098490
AntonIgg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
И ты не сможешь вызвать currvalue, т.к. оно будет очень ругаться. Перед вызовом этой функции надо всегда вызывать nextval
...
Рейтинг: 0 / 0
03.06.2005, 07:43
    #33098616
Vlado
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
AntonIggИ ты не сможешь вызвать currvalue, т.к. оно будет очень ругаться. Перед вызовом этой функции надо всегда вызывать nextval
Не надо.
Ни перед вызовом этой функции вызывать nextval,
ни после её вызова вызывать currval.
Она сама всё вызывает и возвращает.

Другое дело, что мне лично в лом писать такие функции
для каждой таблички с ключевым автоинкрементом.
...
Рейтинг: 0 / 0
03.06.2005, 10:22
    #33098892
wbear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
AntonIgg прав...

currval(seq) будет матюгатся до первого вызова nextval(seq) в сесии ,но не надо при этом забывать что insert в таблицу с автоинкрементным полем неяавно вызывает nextval()
...
Рейтинг: 0 / 0
03.06.2005, 10:54
    #33099026
Vlado
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
wbearAntonIgg прав...

currval(seq) будет матюгатся до первого вызова nextval(seq) в сесии ,но не надо при этом забывать что insert в таблицу с автоинкрементным полем неяавно вызывает nextval()Вставка в таблицу с полем serial неявно вызывает nextval
при отсутствии его значения в запросе INSERT:

insert into tbl (somedata) values ('aaa') - неявный вызов nextval.

insert into tbl (id, somedata) values (100, 'aaa') или
insert into tbl values (100, 'aaa') - честная попытка вставить id=100,
успешная или нет - уже другой вопрос.

Слово "автоинкремент" было употреблено в более широком смысле.
Можно в таблице иметь
1 - id serial
2 - id bigint default nextval('seq_name')
3 - просто id bigint и при вставке пользоваться функцией приведенной XM.

Но функция ХМ будет работать в любом из этих 3-х случаев.
...
Рейтинг: 0 / 0
03.06.2005, 13:04
    #33099547
vfabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
IMHO

надо по максимуму пользоваться возможностями БД

можно конечно написать кучу всего своего но на мой взгляд зачастую это неоправданно

вот про TMP таблицы я бы послушал мнения кто как пользуется и кто что делает (тут есть простор для полета технической мысли :-))

правда это уже совсем другая история ;-)
...
Рейтинг: 0 / 0
03.06.2005, 13:35
    #33099670
wbear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
Vlado
а никто не спорит что будет работать с твоей ХП..

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

по мне так пользы от такой хп нет никакой, и я немогу себе представить ситуация где бы такая функция была бы разумна.
...
Рейтинг: 0 / 0
03.06.2005, 13:38
    #33099681
Vlado
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
vfabrIMHO

надо по максимуму пользоваться возможностями БД

можно конечно написать кучу всего своего но на мой взгляд зачастую это неоправданно
...Ничего криминального в функции XM нету.
Очень удобно использовать на клиенте.
И возможности субд используются на всю катушку.
Кроме того, политика разработки может запрещать прямое обращение к таблице.

В постгресе я такими функциями не пользуюсь,
а firebird'е делал подобные, но там нету currval...
...
Рейтинг: 0 / 0
03.06.2005, 14:07
    #33099759
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
wbear
а никто не спорит что будет работать с твоей ХП..
только с ней мы можем огрести проблеммы
с производительность и проблемму со вставкой не всех полей т.е. если я в каком-то куске кода захочу проинсеритть другое количество полей мне придеться писать еще одну ХП.. а это бред.

Часто вообще не нужно знать id последней записи, и тогда я использую прямые insert :)
wbear
по мне так пользы от такой хп нет никакой, и я немогу себе представить ситуация где бы такая функция была бы разумна.
Польза есть, если вставка идет не в одну таблицу, если требуются хитрые проверки на ограничения, и т.п., что не всегда удобно реализовывать через rules и триггеры.
...
Рейтинг: 0 / 0
03.06.2005, 14:09
    #33099763
Vlado
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
wbearVlado
а никто не спорит что будет работать с твоей ХП..ХП не моя.
wbear...
т.е. если я в каком-то куске кода захочу проинсеритть другое количество полей мне придеться писать еще одну ХП.. а это бред.
...Малость подумать - и не придется.
...
Рейтинг: 0 / 0
05.06.2005, 23:36
    #33101708
Vlado
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
Ща скажу крамолу (для веселухи :))

Наличие currval в постгресе избыточно.
Без большого напряга без него можно обойтись,
самую малость разгрузив сервер (ну очень самую).
Хотя с ним удобнее :)
...
Рейтинг: 0 / 0
06.06.2005, 00:11
    #33101725
vfabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
избыточно все

вопрос в другом насколько соотношение избыточность/полезность правильно выбрано
...
Рейтинг: 0 / 0
26.08.2005, 16:29
    #33236663
KPIIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
Нужна помощь - я где то наверное глючу :
на такое выдает relation "posada_kodposada_seq" does not exist
Код: plaintext
1.
insert into "Posada" ("posadaName") Values('s8dfsdfdsf');
SELECT currval('Posada_kodPosada_seq')
хотя есть такая последовательность... в чем проблема может быть кроме кривых рук?
...
Рейтинг: 0 / 0
26.08.2005, 16:50
    #33236722
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
SELECT currval('"Posada_kodPosada_seq"')
...
Рейтинг: 0 / 0
26.08.2005, 17:38
    #33236870
KPIIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
узнать id добавленной записи или максимальное значение oid
спасибо - работает
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / узнать id добавленной записи или максимальное значение oid / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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