Создание независимой от таблицы последовательности (или эквивалентной) для нескольких сеансов - PullRequest
0 голосов
/ 19 февраля 2020

Мне нужно контролировать числовые последовательности для файлов, которые будут продаваться между клиентами моей компании и их банками. Каждый банковский счет для каждого клиента имеет свою последовательность, и сегодня они управляют этим вручную. У меня была идея использовать PostgreSQL последовательности для выполнения работы.

В последовательности, связанной с полем таблицы (например, первичными ключами), можно вызвать nextval () из любого сеанса и получить следующий номер или currval () для текущего значения. Однако, когда я создал последовательность с помощью CREATE SEQUENCE, не связывая ее с таблицей, я получил другое поведение. Каждый сеанс, вызывающий эти методы, получает результаты независимо друг от друга, и они сбрасываются по окончании сеанса, теряя текущее значение счетчика для этой конкретной последовательности.

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

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

Есть ли способ указать последовательностям вести себя так, как будто они были связаны с таблицами, фактически не делая этого, или мне нужно создать таблицу специально для привязки этих последовательностей? Или, может быть, я ищу что-то еще для решения этой проблемы?

Заранее спасибо за любые мысли.

РЕДАКТИРОВАТЬ: в соответствии с просьбой a_horse_with_no_name, вот полная CREATE SEQUENCE команда I ' m с использованием:

CREATE SEQUENCE IF NOT EXISTS company_X_account_Y_file_Z_seq;

X, Y и Z изменяются в соответствии с балансовой единицей клиента, номером счета и файлом, которым управляют, соответственно. Я не использую никаких специальных команд, таких как CACHE или что-либо еще.

Если это поможет, моя версия PostgreSQL будет 10.6.

...