Как поставить в запись номер для сохранения последовательной нумерации учётом пропусков?
Есть таблица для хранения дерева узлов, в которой есть столбцы
тип элемента дерева| id root элемента | id родителя | порядковый номер в родителе
4 1 1 1
4 1 1 2
4 1 1 5
4 2 66 1
4 2 66 2
4 2 66 7
Нужно скопировать все элементы, у которого id root элемента равен 2 в тот, у которого id root элемента равен 1. Но так, если совпадает тип элемента и его порядковый номер, то перенумеровать номер копируемого объекта в минимальный свободный в диапазоне от 1 до 99. Т.е. если у исходной структуры у элемента номера идут 1,2,5 у копируемого 1,2,7, то итог должен быть 1,2,3,4,5,7.
Т.е. задача при совпадении номеров перегенерировать номер в наименьший свободный в диапазоне от 1 до 99
Предположим сгенерировать цифры я могу так
SELECT "number" FROM (
SELECT generate_series(1, (
SELECT MAX("number") + 99 as "number"
FROM tree_elements te2
WHERE root_id = 1 AND element_type_id = 4)) AS "number"
EXCEPT SELECT "number"
FROM tree_elements te
WHERE root_id = 1 AND element_type_id = 4
) s
ORDER BY "number" LIMIT 99;
Но как это всё прикрутить к копированию строк таблицы я не понимаю. Какие есть мысли на этот счёт? Как эту же задачу решить средствами БД, средствами постгрес? В какую сторону копать? Есть ли подобные функции? Или как-то использовать вложенные циклы?