sql >> Databasteknik >  >> RDS >> PostgreSQL

Jag förstår inte hur postgresqls nextval() fungerar, kan någon förklara?

NEXTVAL är en funktion för att få nästa värde från en sekvens.

Sekvens är ett objekt som returnerar ständigt ökande antal, olika för varje samtal, oavsett transaktioner etc.

Varje gång du ringer NEXTVAL , får du ett annat nummer.

Detta används huvudsakligen för att generera primära surrogatnycklar för dina tabeller.

Du kan skapa en tabell så här:

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

och infoga värden så här:

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

och se vad du får:

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

PostgreSQL erbjuder ett bra syntaxsocker för detta:

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

vilket motsvarar

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

och kan användas så här:

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

Observera att även om du återställer din insert-sats eller kör samtidiga satser från två olika sessioner, kommer de returnerade sekvensvärdena aldrig att vara desamma och aldrig återanvändas (läs det finstilta i dokumentet dock under CYCLE ).

Så du kan vara säker på att alla värden för dina primärnycklar kommer att genereras unika i tabellen.




  1. ORA-01830 vid konvertering av tal till ord

  2. pg gem sslmode=verify-full, var placerar man certifikat?

  3. Fungerar Oracle OCI OCIpasswordChange krypterar överfört lösenord

  4. lagras i mysql-fältet men ingen radbrytning vid eko