sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL nästa värde för sekvenserna?

RETURNING

Det är möjligt med en enda tur och retur till databasen:

INSERT INTO tbl(filename)
VALUES ('my_filename')
RETURNING tbl_id;

tbl_id skulle vanligtvis vara en serial eller IDENTITY (Postgres 10 eller senare) kolumn. Mer i manualen.

Hämta värde explicit

Om filename måste inkludera tbl_id (redundant) kan du fortfarande använda en enda fråga.

Använd lastval() eller den mer specifika currval() :

INSERT INTO tbl (filename)
VALUES ('my_filename' || currval('tbl_tbl_id_seq')   -- or lastval()
RETURNING tbl_id;

Se:

  • Referensvärde för seriell kolumn i en annan kolumn under samma INSERT

Om flera sekvenser kan avanceras i processen (även i form av triggers eller andra biverkningar) är det säkert sättet är att använda currval('tbl_tbl_id_seq') .

Namn på sekvens

strängen literal 'tbl_tbl_id_seq' i mitt exempel antas vara den verkliga namnet på sekvensen och castas till regclass , vilket ger ett undantag om ingen sekvens av det namnet kan hittas i den aktuella search_path .

tbl_tbl_id_seq är den automatiskt genererade standard för en tabell tbl med en seriell kolumn tbl_id . Men det finns inga garantier. En kolumnstandard kan hämta värden från alla sekvens om så definieras. Och om standardnamnet tas när tabellen skapas, väljer Postgres nästa lediga namn enligt en enkel algoritm.

Om du inte vet namnet på sekvensen för en serial kolumnen, använd den dedikerade funktionen pg_get_serial_sequence() . Kan göras i farten:

INSERT INTO tbl (filename)
VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
RETURNING tbl_id;

db<>spela här
Gammal sqlfiddle



  1. SQL Server:Kolumner till rader

  2. Skapa PostgreSQL-ROL (användare) om den inte finns

  3. När jag anropar PreparedStatement.cancel() i ett JDBC-program, dödar det verkligen det i en Oracle-databas?

  4. Hur ställer man in värde till variabel med 'execute' i t-sql?