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

Jeg forstår ikke hvordan postgresqls nextval() virker, kan nogen forklare?

NEXTVAL er en funktion til at få den næste værdi fra en sekvens.

Sekvens er et objekt, som returnerer stadigt stigende tal, forskellige for hvert opkald, uanset transaktioner osv.

Hver gang du ringer til NEXTVAL , får du et andet nummer.

Dette bruges hovedsageligt til at generere primære surrogatnøgler til dine tabeller.

Du kan oprette en tabel som denne:

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

og indsæt værdier som denne:

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

og se, hvad du får:

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

PostgreSQL tilbyder et godt syntakssukker til dette:

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

hvilket svarer til

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

og kan bruges sådan her:

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

Bemærk, at selvom du ruller din insert-sætning tilbage eller kører samtidige sætninger fra to forskellige sessioner, vil de returnerede sekvensværdier aldrig være de samme og aldrig blive genbrugt (læs det med småt i dokumenterne under CYCLE ).

Så du kan være sikker på, at alle værdierne af dine primære nøgler vil blive genereret unikke i tabellen.




  1. hvordan man skriver en forespørgsel baseret på dens kolonne

  2. Konverter en binær til decimal ved hjælp af MySQL

  3. MySQL vil ikke oprette forbindelse ved EC2-implementering med Rubber

  4. Rette:"Ukendt tabel 'locales' i informationsskema" i MariaDB