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