PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Eu não entendo como o nextval() do postgresql funciona, alguém pode explicar?


NEXTVAL é uma função para obter o próximo valor de uma sequência.

Sequence é um objeto que retorna números cada vez maiores, diferentes para cada chamada, independente de transações etc.

Cada vez que você chamar NEXTVAL , você obtém um número diferente.

Isso é usado principalmente para gerar chaves primárias substitutas para suas tabelas.

Você pode criar uma tabela assim:
CREATE SEQUENCE mysequence;
CREATE TABLE mytable (id BIGINT NOT NULL PRIMARY KEY, value INT);

e insira valores como este:
INSERT
INTO    mytable (id, value)
VALUES
        (NEXTVAL('mysequence'), 1),
        (NEXTVAL('mysequence'), 2);

e veja o que você ganha:
SELECT * FROM mytable;
 id | value
----+-------
  1 |     1
  2 |     2

O PostgreSQL oferece um bom açúcar de sintaxe para isso:
CREATE TABLE mytable (id BIGSERIAL PRIMARY KEY, value INT);

que é 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

e pode ser usado assim:
INSERT
INTO    mytable (value)
VALUES  (1),
        (2);  -- you can omit id, it will get filled for you.

Observe que, mesmo que você reverta sua instrução de inserção ou execute instruções simultâneas de duas sessões diferentes, os valores de sequência retornados nunca serão os mesmos e nunca serão reutilizados (leia as letras miúdas nos documentos em CYCLE ).

Assim, você pode ter certeza de que todos os valores de suas chaves primárias serão gerados de forma única dentro da tabela.