Sie können die lastval()Funktion verwenden:
Rückgabewert, der zuletzt mit nextvalfür eine beliebige Sequenz erhalten wurde
Also so etwas wie das:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (lastval());
Dies funktioniert nextval()einwandfrei, solange niemand eine andere Sequenz (in der aktuellen Sitzung) zwischen Ihren INSERTs aufruft.
Wie Denis unten bemerkt und ich oben gewarnt habe, lastval()kann die Verwendung von Sie in Schwierigkeiten geraten, wenn nextval()zwischen Ihren INSERTs auf eine andere Sequenz zugegriffen wird. Dies kann passieren, wenn ein INSERT-Trigger für Table1eine manuell aufgerufene nextval()Sequenz vorhanden ist oder wenn ein INSERT für eine Tabelle mit einem SERIALoder einemBIGSERIAL Primärschlüssel ausgeführt wird. Wenn Sie wirklich paranoid sein wollen (eine gute Sache, sie sind es wirklich, um Sie zu bekommen), dann könnten Sie verwenden, currval()aber Sie müssten den Namen der relevanten Sequenz kennen:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (currval('Table1_id_seq'::regclass));
Die automatisch generierte Sequenz wird normalerweise benannt, t_c_seqwobei tder Tabellenname und cder Spaltenname angegeben sind. Sie können dies jedoch jederzeit herausfinden, indem Sie Folgendes psqlsagen:
=> \d table_name;
und dann den Standardwert für die betreffende Spalte betrachten, zum Beispiel:
id | integer | not null default nextval('people_id_seq'::regclass)
Zu Ihrer Information: lastval()ist mehr oder weniger die PostgreSQL-Version von MySQL LAST_INSERT_ID. Ich erwähne dies nur, weil viele Leute mit MySQL besser vertraut sind als mit PostgreSQL, so dass das Verknüpfen lastval()mit etwas Bekanntem die Dinge klären könnte.