RETURNING
Das ist mit einem einzigen Hin- und Rückflug möglich zur Datenbank:
INSERT INTO tbl(filename)
VALUES ('my_filename')
RETURNING tbl_id;
tbl_id
wäre normalerweise eine serial
oder IDENTITY
(Postgres 10 oder höher)-Spalte. Mehr im Handbuch.
Wert explizit abrufen
Wenn filename
muss tbl_id
enthalten (redundant), Sie können immer noch eine einzelne Abfrage verwenden.
Verwenden Sie lastval()
oder das spezifischere currval()
:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval('tbl_tbl_id_seq') -- or lastval()
RETURNING tbl_id;
Siehe:
- Referenzwert der seriellen Spalte in einer anderen Spalte während desselben INSERT
Wenn dabei mehrere Sequenzen vorangetrieben werden (auch durch Trigger oder andere Nebeneffekte), sicher Der Weg ist die Verwendung von currval('tbl_tbl_id_seq')
.
Name der Sequenz
Das String-Literal 'tbl_tbl_id_seq'
in meinem Beispiel soll das tatsächlich sein Name der Sequenz und wird in regclass
gecastet , die eine Ausnahme auslöst, wenn keine Sequenz dieses Namens im aktuellen search_path
gefunden werden kann .
tbl_tbl_id_seq
ist der automatisch generierte Standard für eine Tabelle tbl
mit einer fortlaufenden Spalte tbl_id
. Aber es gibt keine Garantien. Ein Spaltenstandard kann Werte von beliebigen abrufen Reihenfolge, falls so definiert. Und wenn beim Erstellen der Tabelle der Standardname verwendet wird, wählt Postgres nach einem einfachen Algorithmus den nächsten freien Namen aus.
Falls Sie es nicht wissen der Name der Sequenz für eine serial
verwenden Sie die dedizierte Funktion pg_get_serial_sequence()
. Kann im laufenden Betrieb durchgeführt werden:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
RETURNING tbl_id;
db<>hier fummeln
Altes sqlfiddle