RETURNING
Det är möjligt med en enda tur och retur till databasen:
INSERT INTO tbl(filename)
VALUES ('my_filename')
RETURNING tbl_id;
tbl_id
skulle vanligtvis vara en serial
eller IDENTITY
(Postgres 10 eller senare) kolumn. Mer i manualen.
Hämta värde explicit
Om filename
måste inkludera tbl_id
(redundant) kan du fortfarande använda en enda fråga.
Använd lastval()
eller den mer specifika currval()
:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval('tbl_tbl_id_seq') -- or lastval()
RETURNING tbl_id;
Se:
- Referensvärde för seriell kolumn i en annan kolumn under samma INSERT
Om flera sekvenser kan avanceras i processen (även i form av triggers eller andra biverkningar) är det säkert sättet är att använda currval('tbl_tbl_id_seq')
.
Namn på sekvens
strängen literal 'tbl_tbl_id_seq'
i mitt exempel antas vara den verkliga namnet på sekvensen och castas till regclass
, vilket ger ett undantag om ingen sekvens av det namnet kan hittas i den aktuella search_path
.
tbl_tbl_id_seq
är den automatiskt genererade standard för en tabell tbl
med en seriell kolumn tbl_id
. Men det finns inga garantier. En kolumnstandard kan hämta värden från alla sekvens om så definieras. Och om standardnamnet tas när tabellen skapas, väljer Postgres nästa lediga namn enligt en enkel algoritm.
Om du inte vet namnet på sekvensen för en serial
kolumnen, använd den dedikerade funktionen pg_get_serial_sequence()
. Kan göras i farten:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
RETURNING tbl_id;
db<>spela här
Gammal sqlfiddle