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