Не вярвам, че има прост начин, който е толкова лесен, колкото обикновените поредици, защото:
- Последователността съхранява само един поток от числа (следваща стойност и т.н.). Искате по един за всеки дял.
- Последователностите имат специална обработка, която заобикаля текущата транзакция (за да се избегне условието за състезание). Трудно е да се повтори това на ниво SQL или PL/pgSQL, без да се използват трикове като dblink.
- Свойството на колоната DEFAULT може да използва прост израз или извикване на функция като
nextval('myseq')
; но не може да се отнася до други колони, за да информира функцията от кой поток трябва да идва стойността.
Можете да направите нещо, което работи, но вероятно няма да го мислите просто. Решаване на горните проблеми на свой ред:
- Използвайте таблица за съхраняване на следващата стойност за всички дялове със схема като
multiseq (partition_id, next_val)
. -
Напишете
multinextval(seq_table, partition_id)
функция, която прави нещо като следното:- Създайте нова транзакция, независима от текущата транзакция (един от начините да направите това е чрез dblink; вярвам, че някои други сървърни езици могат да го направят по-лесно).
- Заключете таблицата, посочена в
seq_table
. - Актуализирайте реда, където идентификаторът на дяла е
partition_id
, с увеличена стойност. (Или вмъкнете нов ред със стойност 2, ако няма съществуващ.) - Отвържете тази транзакция и върнете предишния съхранен идентификатор (или 1).
-
Създайте тригер за вмъкване в таблицата на вашите проекти, който използва извикване на
multinextval('projects_table', NEW.Project_ID)
за вмъквания.
Самият аз не съм използвал целия този план, но съм пробвал нещо подобно за всяка стъпка поотделно. Примери за multinextval
функция и тригерът може да бъде предоставен, ако искате да опитате това...