Поле последовательности, отслеживающее отдельные последовательности для первичного ключа / пары последовательностей - PullRequest
3 голосов
/ 24 апреля 2011

У меня есть таблица загруженных пользователем объектов. Каждый пользователь может иметь произвольное количество объектов. Я хочу, чтобы каждый объект имел последовательный идентификатор, например, так:

USERNAME    OBJECTNAME    OBJID
Kerin        cat            1
Kerin        dog            2
Narcolepsy   pie_tins       1
Kerin        mouse          3

Я бы хотел, чтобы OBJID был последовательностью, но отслеживал порядковый номер отдельно для каждого поля USERNAME. Я могу в некотором роде выполнить это, сначала запросив БД и выбрав самый высокий OBJID, а затем увеличив это значение на единицу и используя его в своей INSERT, и это, вероятно, хорошо, поскольку пользователю будет трудно выполнить две загрузки одновременно но накладные расходы на запрос и ощущение, что я делаю это неправильно, заставляют меня хотеть найти лучший способ.

1 Ответ

4 голосов
/ 24 апреля 2011

Если вам не нужно, чтобы они были последовательными, то, возможно, вам не помешает добавление PK типа serial (или bigserial) в таблицу. Числа все равно будут уникальными для каждого имени пользователя, но их будет просто реализовать, и у вас не будет уродства UUID.

Вы можете создать одну последовательность для каждого имени пользователя с помощью ручных CREATE SEQUENCE вызовов. Затем можно добавить триггер BEFORE INSERT , чтобы установить objid, выяснив, какую последовательность использовать, а затем вызвав nextval. Если ваши имена пользователей ограничены обычным шаблоном /[a-z][a-z0-9]*/, вы можете построить имена последовательностей как что-то вроде «seq_objid_ username », и триггер сможет определить, какую последовательность использовать довольно легко; последовательности имен пользователей могут быть созданы с помощью триггера INSERT в вашей пользовательской таблице. Этот подход будет работать, и он будет безопасным, потому что он опирается на существующую систему последовательных транзакций PostgreSQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...