sql >> Base de Datos >  >> RDS >> PostgreSQL

No entiendo cómo funciona nextval() de postgresql, ¿alguien puede explicarlo?

NEXTVAL es una función para obtener el siguiente valor de una secuencia.

Sequence es un objeto que devuelve números cada vez mayores, diferentes para cada llamada, independientemente de las transacciones, etc.

Cada vez que llame a NEXTVAL , obtienes un número diferente.

Esto se usa principalmente para generar claves primarias sustitutas para sus tablas.

Puede crear una tabla como esta:

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

e inserte valores como este:

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

y mira lo que obtienes:

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

PostgreSQL ofrece un buen azúcar de sintaxis para esto:

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

que es equivalente 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

y se puede usar así:

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

Tenga en cuenta que incluso si revierte su declaración de inserción o ejecuta declaraciones simultáneas de dos sesiones diferentes, los valores de secuencia devueltos nunca serán los mismos y nunca se reutilizarán (lea la letra pequeña en los documentos en CYCLE ).

Por lo tanto, puede estar seguro de que todos los valores de sus claves principales se generarán de forma única dentro de la tabla.