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

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

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

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

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

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

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

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

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

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

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

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

ВАСЕ НАДО УЗНАТЬ id СОБСТВЕННОРУЧНО ДОБАВЛЕННОЙ ЗАПИСИ
...
Рейтинг: 0 / 0
узнать id добавленной записи или максимальное значение oid
    #33098245
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё продумано:
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
узнать id добавленной записи или максимальное значение oid
    #33098490
AntonIgg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ты не сможешь вызвать currvalue, т.к. оно будет очень ругаться. Перед вызовом этой функции надо всегда вызывать nextval
...
Рейтинг: 0 / 0
узнать id добавленной записи или максимальное значение oid
    #33098616
Vlado
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntonIggИ ты не сможешь вызвать currvalue, т.к. оно будет очень ругаться. Перед вызовом этой функции надо всегда вызывать nextval
Не надо.
Ни перед вызовом этой функции вызывать nextval,
ни после её вызова вызывать currval.
Она сама всё вызывает и возвращает.

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

currval(seq) будет матюгатся до первого вызова nextval(seq) в сесии ,но не надо при этом забывать что insert в таблицу с автоинкрементным полем неяавно вызывает nextval()
...
Рейтинг: 0 / 0
узнать id добавленной записи или максимальное значение oid
    #33099026
Vlado
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
узнать id добавленной записи или максимальное значение oid
    #33099547
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IMHO

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

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

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

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

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

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

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

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

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

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

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

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


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