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

Non capisco come funziona nextval() di postgresql, qualcuno può spiegarmi?

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.