Sie können die lastval()
Funktion verwenden:
Rückgabewert, der zuletzt mit nextval
fü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 Table1
eine manuell aufgerufene nextval()
Sequenz vorhanden ist oder wenn ein INSERT für eine Tabelle mit einem SERIAL
oder 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_seq
wobei t
der Tabellenname und c
der Spaltenname angegeben sind. Sie können dies jedoch jederzeit herausfinden, indem Sie Folgendes psql
sagen:
=> \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.