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