PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL nächster Wert der Sequenzen?

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