Здравствуйте. Решил с бекенда (Ruby) в целях оптимизации переписать на реализацию в БД. Как лучше сделать подобный функционал - автоматическая нумерация. Есть таблица Institutions, которая является справочником для всех документов, в этой таблице есть поле prefix: string{3}.
Нужно что бы при создании документа, брался последний документ с фильтрацией Institutions.id и если префикс не менялся то просто добалялась к нумерации +1. Например последний документ "ППР00011", то следующий уже будет "ППР00012".
А если документов нет, или префикс поменяли ... то значит нумерация должна начатся сначала. "ППР00001"
Спасибо
Насчет Postgresql не скажу, но в Oracle я бы сделал в тригере before insert по таким шагам (можно на примере этого на постгресе попробовать):
1. select nvl( max( to_number( substr(id,length(prefix)+1) ) ), 0) into res from Institutions where prefix=:new.prefix;
Выбираем максимальное число в строке с заданным префиксом, вырезая из строки префикс и приводя остальное к числу. Если ничего не возвращает значит, автоматом ставим 0.
2. если =0, значит не было таких документов, иначе в res максимум. :new.id := :new.prefix||trim(to_char(res+1,'00000'));
в ID соединяем префикс и следующий номер, номер приводим к char по формату (чтобы были нули впереди).
Другой вопрос, если имелось ввиду, что ранее были префиксы ППР, затем пошел префикс ППК, и когда идет снова ППР он должен начинаться с 1. То тут надо будет смотреть в разрезе последних вводившихся (может с датой есть какое поле и отбирать предыдущий префикс оттуда).