Dat is een bekende beperking:reeksen worden verhoogd tijdens de aanroep van de nextval()
functie, wat uw standaardwaarde van uw veld is. Wanneer u gegevens aanlevert bij INSERT
naar dat veld wordt de uitdrukking van de standaardwaarde niet geëvalueerd, daarom wordt de waarde van de reeks niet aangeraakt.
Een tijdelijke oplossing is om een trigger in te stellen voor/na INSERT
om de waarde van de reeks handmatig te corrigeren met setval()
. Maar op deze manier zou moet een trigger instellen op UPDATE
ook in dat veld, om de waarde van de reeks te corrigeren, wanneer u een bestaande id bijwerkt naar een hogere id.
Een andere oplossing is dat u een opgeslagen functie schrijft, die een beschikbare waarde voor dat veld kan produceren en de standaardwaarde van uw veld op de retourwaarde van die functie kan instellen. Iets, zoals:
LOOP
result = nextval('my_id_seq');
EXIT WHEN NOT EXISTS (SELECT * FROM my_table WHERE my_id = result);
END LOOP;
RETURN result;
Maar wees gewaarschuwd:de standaardfunctionaliteit voor sequenties is veilig voor gelijktijdige inserties (de huidige status van de sequentie is globaal - transactie-onafhankelijk). Als je expliciete waarden aan die velden geeft, is dat niet het geval.