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