Как сбросить автоматически увеличиваемое значение при изменении другого значения? - PullRequest
0 голосов
/ 26 декабря 2018

На самом деле я работаю над структурой БД PostgreSQL, и мне трудно понять, как решить проблему.БД будет записывать данные об объектах архитектуры.Основная таблица, «объект», имеет атрибуты, которые описывают объект с такой информацией, как тип , локализация и т. Д. Одним из этих атрибутов является сериал с именем object_num ,Другая таблица называется «код», которая содержит код из трех букв, соответствующий городу, в котором проводится миссия.

Пример: я работаю над архитектурным инвентарем для города Парижа. code_name будет PRS, а первая запись (она же первый архитектурный объект: дом, мост и т. Д.) Будет связана с object_num 001. Таким образом, PRS001 будет уникальным идентификатором, относящимся кэто конкретный архитектурный объект.Вещи могут продолжаться, я мог бы закончить с довольно многими записями, например, запись PRS745.

Скажите, что эта миссия еще не закончена, но новая начинается для города Бордо, где BDX собирается идентифицироватьинвентарь.Было бы здорово, что идентификатор для первой записи будет BDX001, а не BDX746 (автоинкремент).Учитывая это, было бы также хорошо, что, возвращаясь к миссии в Париже после нескольких записей для миссии в Бордо (скажем, BDX211), следующее значение будет начинаться с (PRS) 745, а не (BDX) 211.

Итак, возможно ли сбросить значение серийного номера до 1 при использовании нового кода?И возможно ли начать последовательный прирост с последнего значения определенного кода?

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

Спасибо за помощь,

Иркутск

1 Ответ

0 голосов
/ 27 декабря 2018

Вы можете создать отдельные последовательности для каждого code_name и получить свой auo-инкремент на основе code_name :

CREATE SEQUENCE PRS START 1;
CREATE SEQUENCE BDX START 1;

insert into your_table (object_num, code_name, other_data) 
                values ( code_name||lpad(nextval(code_name)::char,3,'0')
                       , code_name, other_data);

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

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