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;
Tony
quelle

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

ein Pferd ohne Name
quelle
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

bma
quelle
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.

Xenoterracid
quelle