В качестве альтернативы эта функция может просто сделать SELECT FOR UPDATE и обновить значения вашей таблицы. Я думаю, что должен быть довольно быстрым.

я есть база данных с компаниями и их продуктами, я хочу, чтобы каждая компания имела отдельную последовательность идентификаторов продуктов.

Я знаю, что postgresql не может этого сделать, единственный способ - создать отдельную последовательность для каждой компании, но это громоздко.

Я думал о решении иметь отдельную таблицу для хранения последовательностей

CREATE TABLE "sequence"
(
  "table" character varying(25),
  company_id integer DEFAULT 0,
  "value" integer
)

«таблица» будет содержать имя таблицы для последовательности, такой как продукты, категории и т. д.

и значение будет содержать фактические данные последовательности, которые будут использоваться для product_id на вставках

Я буду использовать значение UPDATE ... RETURNING; чтобы получить идентификатор продукта

Мне было интересно, насколько эффективно это решение?

С блокировкой на уровне строк, только пользователям одной компании, добавляющим строки в одну и ту же таблицу, придется ждать, чтобы получить блокировку, и я думаю, что это уменьшает проблемы состояния гонки.

Есть ли лучший способ решить эту проблему?

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

Ответы на вопрос(2)

Ваш ответ на вопрос