RETURNING
Eso es posible con un solo viaje de ida y vuelta a la base de datos:
INSERT INTO tbl(filename)
VALUES ('my_filename')
RETURNING tbl_id;
tbl_id
normalmente sería una serial
o IDENTITY
(Postgres 10 o posterior) columna. Más en el manual.
Obtener valor explícitamente
Si filename
debe incluir tbl_id
(redundantemente), aún puede usar una sola consulta.
Usa lastval()
o el más específico currval()
:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval('tbl_tbl_id_seq') -- or lastval()
RETURNING tbl_id;
Ver:
- Valor de referencia de la columna serial en otra columna durante el mismo INSERT
Si se pueden avanzar varias secuencias en el proceso (incluso por medio de disparadores u otros efectos secundarios), el seguro La forma es usar currval('tbl_tbl_id_seq')
.
Nombre de la secuencia
El literal de cadena 'tbl_tbl_id_seq'
en mi ejemplo se supone que es el real nombre de la secuencia y se convierte en regclass
, que genera una excepción si no se puede encontrar ninguna secuencia de ese nombre en la search_path
actual .
tbl_tbl_id_seq
es el valor predeterminado generado automáticamente para una tabla tbl
con una columna serial tbl_id
. Pero no hay garantías. Un valor predeterminado de columna puede obtener valores de cualquier secuencia si así se define. Y si se toma el nombre predeterminado al crear la tabla, Postgres elige el siguiente nombre libre de acuerdo con un algoritmo simple.
Si no sabe el nombre de la secuencia para un serial
columna, use la función dedicada pg_get_serial_sequence()
. Se puede hacer sobre la marcha:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
RETURNING tbl_id;
db<>violín aquí
Sqlfiddle antiguo