sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL další hodnota sekvencí?

RETURNING

To je možné jedinou zpáteční cestou do databáze:

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

tbl_id bude obvykle serial nebo IDENTITY (Postgres 10 nebo novější). Více v manuálu.

Explicitně načíst hodnotu

Pokud filename musí obsahovat tbl_id (redundantně), stále můžete použít jeden dotaz.

Použijte lastval() nebo konkrétnější currval() :

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

Viz:

  • Referenční hodnota sériového sloupce v jiném sloupci při stejném INSERT

Pokud může být v procesu pokročilo více sekvencí (i prostřednictvím spouštěčů nebo jiných vedlejších efektů), jisté způsob je použít currval('tbl_tbl_id_seq') .

Název sekvence

řetězcový literál 'tbl_tbl_id_seq' v mém příkladu má být skutečný název sekvence a je přetypován do regclass , což vyvolá výjimku, pokud v aktuální search_path nelze nalézt žádnou sekvenci tohoto názvu .

tbl_tbl_id_seq je automaticky generovaná výchozí hodnota pro tabulku tbl se sériovým sloupcem tbl_id . Ale neexistují žádné záruky. Výchozí sloupec může načítat hodnoty z libovolných sekvence, pokud je tak definována. A pokud se při vytváření tabulky použije výchozí název, Postgres vybere další volné jméno podle jednoduchého algoritmu.

Pokud to nevíte název sekvence pro serial použijte vyhrazenou funkci pg_get_serial_sequence() . Lze provést za chodu:

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

db<>zde hrajte
Starý sqlfiddle



  1. Jak změnit styl data v PostgreSQL?

  2. Datatyp Oracle:Mám použít VARCHAR2 nebo CHAR

  3. Jakou velikost používáte pro varchar (MAX) v deklaraci parametru?

  4. internacionalizovaný regulární výraz v postgresql