RETURNING
Това е възможно с единично двупосочно пътуване към базата данни:
INSERT INTO tbl(filename)
VALUES ('my_filename')
RETURNING tbl_id;
tbl_id обикновено е serial или IDENTITY (Postgres 10 или по-нова версия) колона. Повече в ръководството.
Изрично извличане на стойност
Ако filename трябва да включва tbl_id (излишно), все още можете да използвате една заявка.
Използвайте lastval() или по-конкретният currval() :
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval('tbl_tbl_id_seq') -- or lastval()
RETURNING tbl_id;
Вижте:
- Референтна стойност на серийната колона в друга колона по време на същото INSERT
Ако няколко последователности могат да бъдат напреднали в процеса (дори чрез задействания или други странични ефекти), сигурно начинът е да използвате currval('tbl_tbl_id_seq') .
Име на последователността
Стринговият литерал 'tbl_tbl_id_seq' в моя пример се предполага, че е действителният име на последователността и се прехвърля към regclass , което поражда изключение, ако не може да бъде намерена последователност от това име в текущия search_path .
tbl_tbl_id_seq е автоматично генерираното по подразбиране за таблица tbl със серийна колона tbl_id . Но няма гаранции. Една колона по подразбиране може да извлича стойности от всякак последователност, ако е така дефинирана. И ако името по подразбиране е взето при създаването на таблицата, Postgres избира следващото безплатно име според прост алгоритъм.
Ако незнате името на последователността за serial колона, използвайте специалната функция pg_get_serial_sequence() . Може да се направи в движение:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
RETURNING tbl_id;
db<>цигулка тук
Стар sqlfiddle