Det är en känd begränsning:sekvenser ökas under anropet av nextval()
funktion, vilket är ditt standardvärde för ditt fält. När du anger data på INSERT
i det fältet utvärderas inte standardvärdets uttryck, det är därför sekvensens värde inte berörs.
En lösning är att ställa in en trigger före/efter INSERT
för att manuellt fixa sekvensens värde med setval()
. Men på det här sättet bör måste ställa in en trigger på UPDATE
på det fältet också, för att fixa sekvensens värde, när du bara uppdaterar något befintligt id till ett högre id.
En annan lösning är att du skriver en lagrad funktion, som kan producera ett tillgängligt värde för det fältet och ställa in ditt fälts standardvärde till den funktionens returvärde. Något, som:
LOOP
result = nextval('my_id_seq');
EXIT WHEN NOT EXISTS (SELECT * FROM my_table WHERE my_id = result);
END LOOP;
RETURN result;
Men varnas:standardfunktionen för sekvenser är säker för samtidiga insättningar (det aktuella tillståndet för sekvensen är globalt - transaktionsoberoende). Om du anger explicita värden till dessa fält, kommer det inte att vara fallet.