PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Ich verstehe nicht, wie nextval() von postgresql funktioniert, kann mir das jemand erklären?

NEXTVAL ist eine Funktion, um den nächsten Wert aus einer Sequenz zu erhalten.

Sequence ist ein Objekt, das immer höhere Zahlen zurückgibt, die für jeden Anruf unterschiedlich sind, unabhängig von Transaktionen usw.

Jedes Mal, wenn Sie NEXTVAL aufrufen , erhalten Sie eine andere Nummer.

Dies wird hauptsächlich verwendet, um Ersatz-Primärschlüssel für Ihre Tabellen zu generieren.

Sie können eine Tabelle wie folgt erstellen:

CREATE SEQUENCE mysequence;
CREATE TABLE mytable (id BIGINT NOT NULL PRIMARY KEY, value INT);

und fügen Sie Werte wie diese ein:

INSERT
INTO    mytable (id, value)
VALUES
        (NEXTVAL('mysequence'), 1),
        (NEXTVAL('mysequence'), 2);

und sehen Sie, was Sie bekommen:

SELECT * FROM mytable;
 id | value
----+-------
  1 |     1
  2 |     2

PostgreSQL bietet dafür einen netten Syntaxzucker:

CREATE TABLE mytable (id BIGSERIAL PRIMARY KEY, value INT);

was äquivalent zu

ist
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

und kann wie folgt verwendet werden:

INSERT
INTO    mytable (value)
VALUES  (1),
        (2);  -- you can omit id, it will get filled for you.

Beachten Sie, dass selbst wenn Sie Ihre Insert-Anweisung rückgängig machen oder gleichzeitige Anweisungen aus zwei verschiedenen Sitzungen ausführen, die zurückgegebenen Sequenzwerte niemals gleich sind und niemals wiederverwendet werden (lesen Sie jedoch das Kleingedruckte in der Dokumentation unter CYCLE ).

So können Sie sicher sein, dass alle Werte Ihrer Primärschlüssel innerhalb der Tabelle eindeutig generiert werden.