Вы можете использовать lastval()функцию:
Возвращаемое значение, полученное последним с помощью nextvalдля любой последовательности
Так что примерно так:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (lastval());
Это будет работать нормально, пока никто не вызовет nextval()какую-либо другую последовательность (в текущем сеансе) между вашими INSERT.
Как Денис отметил ниже, а я предупреждал об этом выше, использование lastval()может вызвать у вас проблемы, если доступ к другой последовательности будет осуществляться nextval()между вашими INSERT. Это могло произойти, если бы был триггер INSERT для Table1ручного вызова 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()это более или менее версия MySQL для PostgreSQL LAST_INSERT_ID. Я упоминаю об этом только потому, что многие люди более знакомы с MySQL, чем с PostgreSQL, поэтому ссылка lastval()на что-то знакомое может прояснить ситуацию.