sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL siguiente valor de las secuencias?

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