Questa è una limitazione nota:le sequenze vengono incrementate durante la chiamata di nextval()
funzione, che è il valore predefinito del tuo campo. Quando fornisci i dati in INSERT
a quel campo, l'espressione del valore predefinito non viene valutata, ecco perché il valore della sequenza non viene toccato.
Una soluzione alternativa consiste nell'impostare un trigger prima/dopo INSERT
per correggere manualmente il valore della sequenza con setval()
. Ma in questo modo dovresti è necessario impostare un trigger su UPDATE
anche su quel campo, per correggere il valore della sequenza, quando aggiorni semplicemente un ID esistente con un ID più alto.
Un'altra soluzione è scrivere una funzione memorizzata, che può produrre un valore disponibile per quel campo e impostare il valore predefinito del campo sul valore restituito di quella funzione. Qualcosa, come:
LOOP
result = nextval('my_id_seq');
EXIT WHEN NOT EXISTS (SELECT * FROM my_table WHERE my_id = result);
END LOOP;
RETURN result;
Ma attenzione:la funzionalità predefinita per le sequenze è sicura per inserimenti simultanei (lo stato corrente della sequenza è globale, indipendente dalla transazione). Se fornisci valori espliciti a quei campi, non sarà così.