Nevěřím, že existuje jednoduchý způsob, který by byl stejně snadný jako běžné sekvence, protože:
- Sekvence ukládá pouze jeden číselný proud (další hodnotu atd.). Chcete jeden pro každý oddíl.
- Sekvence mají speciální zpracování, které obchází aktuální transakci (aby se předešlo sporu). Je těžké to replikovat na úrovni SQL nebo PL/pgSQL bez použití triků jako dblink.
- Vlastnost sloupce DEFAULT může používat jednoduchý výraz nebo volání funkce jako
nextval('myseq')
; ale nemůže odkazovat na jiné sloupce, aby informoval funkci, ze kterého proudu by měla hodnota pocházet.
Můžete vyrobit něco, co funguje, ale pravděpodobně to nebudete myslet jednoduše. Postupné řešení výše uvedených problémů:
- Použijte tabulku k uložení další hodnoty pro všechny oddíly se schématem jako
multiseq (partition_id, next_val)
. -
Napište
multinextval(seq_table, partition_id)
funkce, která dělá něco jako následující:- Vytvořte novou transakci nezávislou na aktuální transakci (jeden způsob, jak toho dosáhnout, je prostřednictvím dblink; domnívám se, že některé jiné serverové jazyky to dokážou snadněji).
- Zamkněte tabulku uvedenou v
seq_table
. - Aktualizujte řádek, kde je ID oddílu
partition_id
, se zvýšenou hodnotou. (Nebo vložte nový řádek s hodnotou 2, pokud žádný neexistuje.) - Potvrdit transakci a vrátit předchozí uložené ID (nebo 1).
-
Vytvořte spouštěč vložení v tabulce projektů, který používá volání
multinextval('projects_table', NEW.Project_ID)
pro vložení.
Sám jsem nepoužil celý tento plán, ale zkoušel jsem něco podobného pro každý krok jednotlivě. Příklady multinextval
Pokud se o to chcete pokusit...