PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL prossimo valore delle sequenze?

RETURNING

Questo è possibile con un unico viaggio di andata e ritorno al database:

INSERT INTO tbl(filename)
VALUES ('my_filename')
RETURNING tbl_id;

tbl_id in genere sarebbe un serial o IDENTITY (Postgres 10 o successivo). Maggiori informazioni nel manuale.

Recupera esplicitamente il valore

Se filename deve includere tbl_id (ridondante), puoi comunque utilizzare una singola query.

Usa lastval() o il più specifico currval() :

INSERT INTO tbl (filename)
VALUES ('my_filename' || currval('tbl_tbl_id_seq')   -- or lastval()
RETURNING tbl_id;

Vedi:

  • Valore di riferimento della colonna seriale in un'altra colonna durante lo stesso INSERT

Se più sequenze possono essere avanzate nel processo (anche tramite trigger o altri effetti collaterali) il sicuro il modo è usare currval('tbl_tbl_id_seq') .

Nome della sequenza

Il letterale stringa 'tbl_tbl_id_seq' nel mio esempio dovrebbe essere il effettivo nome della sequenza e viene eseguito il cast su regclass , che solleva un'eccezione se non è possibile trovare alcuna sequenza con quel nome nel search_path corrente .

tbl_tbl_id_seq è l'impostazione predefinita generata automaticamente per una tabella tbl con una colonna seriale tbl_id . Ma non ci sono garanzie. Una colonna predefinita può recuperare valori da qualsiasi sequenza se così definita. E se viene utilizzato il nome predefinito durante la creazione della tabella, Postgres sceglie il successivo nome libero secondo un semplice algoritmo.

Se non sai il nome della sequenza per un serial colonna, utilizzare la funzione dedicata pg_get_serial_sequence() . Può essere fatto al volo:

INSERT INTO tbl (filename)
VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
RETURNING tbl_id;

db<>gioca qui
Sqlfiddle vecchio