Puede utilizar la lastval()
función:
Valor de retorno obtenido más recientemente con nextval
para cualquier secuencia
Entonces algo como esto:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (lastval());
Esto funcionará bien siempre que nadie llame nextval()
a ninguna otra secuencia (en la sesión actual) entre sus INSERT.
Como Denis señaló a continuación y sobre lo que advertí anteriormente, el uso lastval()
puede nextval()
causarle problemas si accede a otra secuencia entre sus INSERT. Esto podría suceder si hubiera un desencadenador INSERT en Table1
ese llamado manualmente nextval()
en una secuencia o, más probablemente, hizo un INSERT en una tabla con una clave primaria SERIAL
oBIGSERIAL
. Si quieres ser realmente paranoico (una cosa buena, que son en realidad a conseguir que después de todo), entonces se podría usar currval()
, pero que había necesidad de saber el nombre de la secuencia relevante:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (currval('Table1_id_seq'::regclass));
La secuencia generada automáticamente generalmente se nombra t_c_seq
donde t
está el nombre de la tabla y c
el nombre de la columna, pero siempre puede averiguarlo ingresando psql
y diciendo:
=> \d table_name;
y luego mirando el valor predeterminado para la columna en cuestión, por ejemplo:
id | integer | not null default nextval('people_id_seq'::regclass)
FYI: lastval()
es, más o menos, la versión PostgreSQL de MySQL LAST_INSERT_ID
. Solo menciono esto porque mucha gente está más familiarizada con MySQL que con PostgreSQL, por lo que vincular lastval()
a algo familiar podría aclarar las cosas.