Det er en kendt begrænsning:sekvenser øges under opkaldet af nextval()
funktion, som er din standardværdi for dit felt. Når du leverer data på INSERT
til det felt evalueres standardværdiens udtryk ikke, det er derfor, sekvensens værdi ikke berøres.
En løsning er at konfigurere en trigger før/efter INSERT
for manuelt at rette sekvensens værdi med setval()
. Men på denne måde bør du skal konfigurere en trigger på OPDATERING
også på det felt for at rette sekvensens værdi, når du bare opdaterer et eksisterende id til et højere id.
En anden løsning er, at du skriver en lagret funktion, som kan producere en tilgængelig værdi for det felt og indstille dit felts standardværdi til den funktions returværdi. Noget, som:
LOOP
result = nextval('my_id_seq');
EXIT WHEN NOT EXISTS (SELECT * FROM my_table WHERE my_id = result);
END LOOP;
RETURN result;
Men vær advaret:Standardfunktionaliteten for sekvenser er sikker for samtidige indsættelser (sekvensens aktuelle tilstand er global - transaktionsuafhængig). Hvis du angiver eksplicitte værdier til disse felter, vil det ikke være tilfældet.