PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Sequenza di aggiornamento sulla riga INSERT

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ì.