Вы можете использовать функцию lastval()
:
Возвращаемое значение, полученное последним с nextval
для любой последовательности
Так что-то вроде этого:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (lastval());
Это будет работать нормально, пока никто не вызовет nextval()
для любой другой последовательности (в текущем сеансе) между вашими INSERT.
Как указано Денис ниже, а я предупреждал о вышеизложенном, использование lastval()
может вызвать проблемы, если к другой последовательности обращаются, используя nextval()
между вашими INSERT. Это может произойти, если в Table1
был триггер INSERT, который вручную вызвал nextval()
в последовательности или, что более вероятно, INSERT в таблице с первичным ключом SERIAL
или BIGSERIAL
, Если вы хотите быть действительно параноиком (хорошая вещь, они на самом деле вы, чтобы получить вас в конце концов), тогда вы можете использовать currval()
, но вам нужно знать название соответствующей последовательности:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (currval('Table1_id_seq'::regclass));
Автоматически сгенерированная последовательность обычно называется t_c_seq
, где t
- это имя таблицы, а c
- это имя столбца, но вы всегда можете узнать, зайдя в psql
и сказав:
=> \d table_name;
и затем поиск значения по умолчанию для рассматриваемого столбца, например:
id | integer | not null default nextval('people_id_seq'::regclass)
К вашему сведению: lastval()
является более или менее PostgreSQL-версией MySQL LAST_INSERT_ID
. Я упоминаю об этом только потому, что многие люди лучше знакомы с MySQL, чем с PostgreSQL, поэтому ссылка lastval()
на что-то знакомое может прояснить ситуацию.