Вы можете использовать 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()
на что-то знакомое может прояснить ситуацию.