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