Ist so etwas möglich?
INSERT INTO Table2 (val)
VALUES ((INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id));
Möchten Sie den Rückgabewert als Wert verwenden, um eine Zeile in eine zweite Tabelle mit einem Verweis auf die erste Tabelle einzufügen?
postgresql
sql-returning
Eike Cochu
quelle
quelle
rows
durch(some_query returning ...)
könnte heutzutage funktionieren (habe es nicht versucht).Die beste Vorgehensweise für diese Situation. Verwenden Sie
RETURNING … INTO
.INSERT INTO teams VALUES (...) RETURNING id INTO last_id;
Beachten Sie, dass dies für PLPGSQL gilt
quelle
RETURNING ... INTO
.In Übereinstimmung mit der Antwort von Denis de Bernardy ..
Wenn Sie möchten, dass die ID auch danach zurückgegeben wird, und weitere Elemente in Tabelle 2 einfügen möchten:
with rows as ( INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id ) INSERT INTO Table2 (val, val2, val3) SELECT id, 'val2value', 'val3value' FROM rows RETURNING val
quelle
DO $$ DECLARE tableId integer; BEGIN INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id INTO tableId; INSERT INTO Table2 (val) VALUES (tableId); END $$;
Getestet mit psql (10.3, Server 9.6.8)
quelle
Sie können die
lastval()
Funktion verwenden: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, wennnextval()
zwischen Ihren INSERTs auf eine andere Sequenz zugegriffen wird. Dies kann passieren, wenn ein INSERT-Trigger fürTable1
eine manuell aufgerufenenextval()
Sequenz vorhanden ist oder wenn ein INSERT für eine Tabelle mit einemSERIAL
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
wobeit
der Tabellenname undc
der Spaltenname angegeben sind. Sie können dies jedoch jederzeit herausfinden, indem Sie Folgendespsql
sagen:und dann den Standardwert für die betreffende Spalte betrachten, zum Beispiel:
Zu Ihrer Information:
lastval()
ist mehr oder weniger die PostgreSQL-Version von MySQLLAST_INSERT_ID
. Ich erwähne dies nur, weil viele Leute mit MySQL besser vertraut sind als mit PostgreSQL, so dass das Verknüpfenlastval()
mit etwas Bekanntem die Dinge klären könnte.quelle
lastval
ist, dass sich hinter Ihrem Rücken möglicherweise ein sequenzbasiertes INSERT von einem AFTER INSERT-Trigger in Tabelle 1 befindet. Das wäre in der aktuellen Sitzung und würde sich vermutlich ändern,lastval()
wenn Sie es nicht erwarten.INSERT INTO table_ex(camp1,camp2) VALUES ('xxx','123') RETURNING id
quelle