Jeg tror ikke på, at der er en enkel måde, der er så let som almindelige sekvenser, fordi:
- En sekvens gemmer kun én talstrøm (næste værdi osv.). Du vil have en for hver partition.
- Sekvenser har speciel håndtering, der omgår den aktuelle transaktion (for at undgå løbstilstanden). Det er svært at replikere dette på SQL- eller PL/pgSQL-niveau uden at bruge tricks som dblink.
- DEFAULT kolonneegenskaben kan bruge et simpelt udtryk eller et funktionskald som
nextval('myseq')
; men den kan ikke henvise til andre kolonner for at informere funktionen om, hvilken strøm værdien skal komme fra.
Du kan lave noget, der virker, men du vil nok ikke synes, det er simpelt. Løsning af ovenstående problemer på skift:
- Brug en tabel til at gemme den næste værdi for alle partitioner med et skema som
multiseq (partition_id, next_val)
. -
Skriv en
multinextval(seq_table, partition_id)
funktion, der gør noget i stil med følgende:- Opret en ny transaktion uafhængig af den aktuelle transaktion (en måde at gøre dette på er gennem dblink; jeg tror, at nogle andre serversprog kan gøre det nemmere).
- Lås tabellen nævnt i
seq_table
. - Opdater rækken, hvor partitions-id'et er
partition_id
, med en øget værdi. (Eller indsæt en ny række med værdi 2, hvis der ikke er nogen eksisterende.) - Bekræft den transaktion, og returner det tidligere gemte id (eller 1).
-
Opret en insert-trigger på din projekttabel, der bruger et kald til
multinextval('projects_table', NEW.Project_ID)
til indsættelser.
Jeg har ikke selv brugt hele denne plan, men jeg har prøvet noget lignende til hvert trin individuelt. Eksempler på multinextval
funktion og udløseren kan leveres, hvis du vil prøve dette...