блочный serial, или как его еще обозвать

iamFake

Mind Of Liberty
Здравствуйте.

Имеется таблица, список сообщений пользователей, уникальным полем является id (serial тип). Есть ли в постгресе фунционал для "блочного отсчета инкремента"? нужно такое поведение

id - номер сообщения
userid - идентификатор пользователя [integer]

id инкрементится стандартно от еденицы и является уникальным в пределах одного и тогоже userid, т.е. может быть 2 поля с id равным 5 но с разным userid - как такое можно реализовать?
 

iamFake

Mind Of Liberty
ммм... не совсем понял как это должно выглядеть...

сейчас по подсказке реализовал через тригер, примари кей на uid+id... единственное что мне не нравится в этом варианте - в тригере делается подзапрос для вычисления максимального id для данного uid
PHP:
SELECT MAX(id) INTO queryMaxId FROM test WHERE uid=NEW.uid;
 

phprus

Moderator
Команда форума
iamFake
уникальным полем является id (serial тип)
и
т.е. может быть 2 поля с id равным 5
Противоречие?

Какую цель ты преследуешь, реализуя такую странную и неоправданно сложную схему?
(Или это перенос проекта с MySQL?)
 

MiksIr

miksir@home:~$
Кривым идеям - кривые решения.
Либо подзапрос либо на каждого юзера свой сиквенс заводить с именем как функция от userid и в тригере его создавать/получать значение.
Но лучше пересмотреть кривую идею.
 

iamFake

Mind Of Liberty
iamFake
Какую цель ты преследуешь, реализуя такую странную и неоправданно сложную схему?
(Или это перенос проекта с MySQL?)
личные сообщения пользователя, собирался делать уникальный ид сообщения только в пределах пользователя. т.е. ссылка /msg/read/1 у разных пользователей указывает на разные сообщения(с точки зрения базы). но из за доп.запроса забил на эту мысль...
 

MiksIr

miksir@home:~$
Если по каким-то причинам хочется скрыть сквозной номер, то генери в отдельное поле некий числобуквенный рандом ключ.
 

~WR~

Новичок
На самом деле - задача реально не такая простая, как кажется.
Если вычислять max_id в триггере, то вы легко можете попасть в ситуацию, когда две параллельные транзакции посчитают одно и то же значение.

Можно хранить текущее значение в отдельной колонке в таблице юзеров, и выбирать его через SELECT ... FOR UPDATE, тем самым защищаясь от конкурентных транзакций. Но, вообще говоря, схема тоже не фонтан.
 
Сверху