Eine Möglichkeit, die ID in einer Transaktion mit mehreren Einfügungen zu referenzieren? (postgres)


8

Angenommen, die Tabelle "entity.eid" wird automatisch inkrementiert, möchte ich auf den später in derselben Transaktion zugewiesenen Wert für die automatische Inkrementierung verweisen können. Ich habe dies getan, indem ich mehrere Transaktionen durchgeführt habe, die ich für nicht optimal halte.

START TRANSACTION;
INSERT INTO entity ...;
INSERT INTO t2 (eid, ...) VALUES (?NEW EID REF HERE?, ...), (...), (...);
COMMIT;

Antworten:


11

Es gibt verschiedene Möglichkeiten, dies zu tun.

Am einfachsten ist es, die lastval()Funktion zu verwenden, die den Wert zurückgibt, der durch die "letzte" Sequenz nextval generiert wurde.

START TRANSACTION;
INSERT INTO entity ...;
INSERT INTO t2 (eid, ...) VALUES (lastval(), ...), (...), (...);
COMMIT;

Wenn Sie den Namen der Sequenz für die entityTabelle kennen, können Sie auch die folgende currvalFunktion verwenden:

START TRANSACTION;
INSERT INTO entity ...;
INSERT INTO t2 (eid, ...) VALUES (currval('entity_eid_seq'), ...), (...), (...);
COMMIT;

Dies kann allgemeiner geschrieben werden, indem die pg_get_serial_sequence()Funktion verwendet wird, ohne den Sequenznamen fest zu codieren:

START TRANSACTION;
INSERT INTO entity ...;
INSERT INTO t2 (eid, ...) VALUES (currval(pg_get_serial_sequence('entity', 'eid')), ...), (...);
COMMIT;

Weitere Informationen finden Sie im Handbuch: http://www.postgresql.org/docs/current/static/functions-sequence.html


7

Sie geben Ihre Postgresql-Version nicht an, aber wenn Sie 8.4+ verwenden, können Sie die RETURNINGKlausel verwenden, um die ID (oder eine beliebige Spalte) zurückzugeben, die gerade eingefügt wurde.

Dokumente: http://www.postgresql.org/docs/current/static/sql-insert.html

Beispiel:

INSERT INTO t2 (eid, ...) VALUES (...) RETURNING eid;

Wenn Sie Postgresql Version 9.1+ verwenden, können Sie auch WITHKlauseln (auch bekannt als Common Table Expressions) verwenden, um das Einfügen in eine Klausel RETURNINGdurchzuführen. Verweisen Sie dann auf die Werte aus der Klausel, um weitere Aktionen auszuführen (die WITH-Klauseln können miteinander verkettet werden).

Docs on- WITHKlausel: http://www.postgresql.org/docs/current/static/queries-with.html


4

Es ist erwähnenswert, dass SERIAL in Postgres nur eine INT mit einer SEQUENCE als Standardwert ist. Sie können den Sequenzer auch einfach selbst in einer Transaktion abfragen, anstatt ihn in die Tabelle einzufügen, damit die Standardeinstellung erfolgt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.