RETURNING
To je možné jedinou zpáteční cestou do databáze:
INSERT INTO tbl(filename)
VALUES ('my_filename')
RETURNING tbl_id;
tbl_id bude obvykle serial nebo IDENTITY (Postgres 10 nebo novější). Více v manuálu.
Explicitně načíst hodnotu
Pokud filename musí obsahovat tbl_id (redundantně), stále můžete použít jeden dotaz.
Použijte lastval() nebo konkrétnější currval() :
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval('tbl_tbl_id_seq') -- or lastval()
RETURNING tbl_id;
Viz:
- Referenční hodnota sériového sloupce v jiném sloupci při stejném INSERT
Pokud může být v procesu pokročilo více sekvencí (i prostřednictvím spouštěčů nebo jiných vedlejších efektů), jisté způsob je použít currval('tbl_tbl_id_seq') .
Název sekvence
řetězcový literál 'tbl_tbl_id_seq' v mém příkladu má být skutečný název sekvence a je přetypován do regclass , což vyvolá výjimku, pokud v aktuální search_path nelze nalézt žádnou sekvenci tohoto názvu .
tbl_tbl_id_seq je automaticky generovaná výchozí hodnota pro tabulku tbl se sériovým sloupcem tbl_id . Ale neexistují žádné záruky. Výchozí sloupec může načítat hodnoty z libovolných sekvence, pokud je tak definována. A pokud se při vytváření tabulky použije výchozí název, Postgres vybere další volné jméno podle jednoduchého algoritmu.
Pokud to nevíte název sekvence pro serial použijte vyhrazenou funkci pg_get_serial_sequence() . Lze provést za chodu:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
RETURNING tbl_id;
db<>zde hrajte
Starý sqlfiddle