NEXTVAL
è una funzione per ottenere il valore successivo da una sequenza.
La sequenza è un oggetto che restituisce numeri sempre crescenti, diversi per ogni chiamata, indipendentemente dalle transazioni ecc.
Ogni volta che chiami NEXTVAL
, ottieni un numero diverso.
Viene utilizzato principalmente per generare chiavi primarie surrogate per le tue tabelle.
Puoi creare una tabella come questa:
CREATE SEQUENCE mysequence;
CREATE TABLE mytable (id BIGINT NOT NULL PRIMARY KEY, value INT);
e inserisci valori come questo:
INSERT
INTO mytable (id, value)
VALUES
(NEXTVAL('mysequence'), 1),
(NEXTVAL('mysequence'), 2);
e guarda cosa ottieni:
SELECT * FROM mytable;
id | value
----+-------
1 | 1
2 | 2
PostgreSQL offre una buona sintassi per questo:
CREATE TABLE mytable (id BIGSERIAL PRIMARY KEY, value INT);
che equivale a
CREATE SEQUENCE mytable_id_seq; -- table_column_'seq'
CREATE TABLE mytable (id BIGINT NOT NULL PRIMARY KEY DEFAULT NEXTVAL('mytable_id_seq'), value INT); -- it's not null and has a default value automatically
e può essere utilizzato in questo modo:
INSERT
INTO mytable (value)
VALUES (1),
(2); -- you can omit id, it will get filled for you.
Nota che anche se esegui il rollback della tua istruzione insert o esegui istruzioni simultanee da due sessioni diverse, i valori di sequenza restituiti non saranno mai gli stessi e non verranno mai riutilizzati (leggi la stampa fine nei documenti anche se in CYCLE
).
Quindi puoi essere sicuro che tutti i valori delle tue chiavi primarie verranno generati univoci all'interno della tabella.