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

PostgreSQL próximo valor das sequências?

RETURNING


Isso é possível com uma única viagem de ida e volta para o banco de dados:
INSERT INTO tbl(filename)
VALUES ('my_filename')
RETURNING tbl_id;

tbl_id normalmente seria um serial ou IDENTITY (Postgres 10 ou posterior). Mais no manual.

Buscar valor explicitamente


Se filename precisa incluir tbl_id (redundantemente), você ainda pode usar uma única consulta.

Use lastval() ou o currval() mais específico :
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval('tbl_tbl_id_seq')   -- or lastval()
RETURNING tbl_id;

Ver:
  • Valor de referência da coluna serial em outra coluna durante o mesmo INSERT

Se várias sequências puderem ser avançadas no processo (mesmo por meio de gatilhos ou outros efeitos colaterais), a certeza maneira é usar currval('tbl_tbl_id_seq') .

Nome da sequência


O literal de string 'tbl_tbl_id_seq' no meu exemplo deve ser o real nome da sequência e é convertido em regclass , que gera uma exceção se nenhuma sequência desse nome puder ser encontrada no search_path atual .

tbl_tbl_id_seq é o padrão gerado automaticamente para uma tabela tbl com uma coluna serial tbl_id . Mas não há garantias. Um padrão de coluna pode buscar valores de qualquer sequência, se assim definida. E se o nome padrão for usado ao criar a tabela, o Postgres escolhe o próximo nome livre de acordo com um algoritmo simples.

Se você não saber o nome da sequência para um serial coluna, use a função dedicada pg_get_serial_sequence() . Pode ser feito na hora:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
RETURNING tbl_id;

db<>mexa aqui
antigo sqlfiddle