Puoi usare la lastval()
funzione:
Restituisce il valore ottenuto più di recente con nextval
per qualsiasi sequenza
Quindi qualcosa del genere:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (lastval());
Questo funzionerà bene finché nessuno chiama nextval()
su un'altra sequenza (nella sessione corrente) tra i tuoi INSERT.
Come Denis ha notato di seguito e ho avvertito sopra, l'uso lastval()
può metterti nei guai se si accede a un'altra sequenza usando nextval()
tra i tuoi INSERT. Ciò potrebbe accadere se ci fosse un trigger INSERT su Table1
quello chiamato manualmente nextval()
su una sequenza o, più probabilmente, se facesse un INSERT su una tabella con una chiave primaria SERIAL
oBIGSERIAL
. Se si vuole essere veramente paranoico (una buona cosa, che in realtà sono di ottenere voi, dopo tutto), allora si potrebbe utilizzare currval()
, ma avresti bisogno di conoscere il nome della sequenza in questione:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (currval('Table1_id_seq'::regclass));
La sequenza generata automaticamente è solitamente denominata t_c_seq
dove t
è il nome della tabella ed c
è il nome della colonna, ma puoi sempre scoprirlo entrando psql
e dicendo:
=> \d table_name;
e quindi guardando il valore predefinito per la colonna in questione, ad esempio:
id | integer | not null default nextval('people_id_seq'::regclass)
FYI: lastval()
è, più o meno, la versione PostgreSQL di MySQLLAST_INSERT_ID
. Lo dico solo perché molte persone hanno più familiarità con MySQL che con PostgreSQL, quindi collegarsi lastval()
a qualcosa di familiare potrebbe chiarire le cose.