NEXTVAL
to funkcja pobierająca następną wartość z sekwencji.
Sekwencja to obiekt, który zwraca coraz większe liczby, różne dla każdego połączenia, niezależnie od transakcji itp.
Za każdym razem, gdy dzwonisz do NEXTVAL
, otrzymasz inny numer.
Jest to używane głównie do generowania zastępczych kluczy podstawowych dla tabel.
Możesz utworzyć taką tabelę:
CREATE SEQUENCE mysequence;
CREATE TABLE mytable (id BIGINT NOT NULL PRIMARY KEY, value INT);
i wstawiaj wartości w ten sposób:
INSERT
INTO mytable (id, value)
VALUES
(NEXTVAL('mysequence'), 1),
(NEXTVAL('mysequence'), 2);
i zobacz, co otrzymasz:
SELECT * FROM mytable;
id | value
----+-------
1 | 1
2 | 2
PostgreSQL oferuje w tym celu niezłą składnię:
CREATE TABLE mytable (id BIGSERIAL PRIMARY KEY, value INT);
co jest równoznaczne z
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
i może być używany w następujący sposób:
INSERT
INTO mytable (value)
VALUES (1),
(2); -- you can omit id, it will get filled for you.
Zauważ, że nawet jeśli wycofasz swoją instrukcję INSERT lub uruchomisz jednoczesne instrukcje z dwóch różnych sesji, zwrócone wartości sekwencji nigdy nie będą takie same i nigdy nie zostaną ponownie użyte (przeczytaj drobny druk w dokumentacji, chociaż w sekcji CYCLE
).
Dzięki temu możesz mieć pewność, że wszystkie wartości Twoich kluczy podstawowych zostaną wygenerowane unikatowo w tabeli.