RETURNING
Det er muligt med en enkelt tur-retur til databasen:
INSERT INTO tbl(filename)
VALUES ('my_filename')
RETURNING tbl_id;
tbl_id
vil typisk være en serial
eller IDENTITY
(Postgres 10 eller senere) kolonne. Mere i manualen.
Hent eksplicit værdi
Hvis filename
skal inkludere tbl_id
(redundant) kan du stadig bruge en enkelt forespørgsel.
Brug lastval()
eller den mere specifikke currval()
:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval('tbl_tbl_id_seq') -- or lastval()
RETURNING tbl_id;
Se:
- Referenceværdi for seriel kolonne i en anden kolonne under samme INSERT
Hvis flere sekvenser kan blive avanceret i processen (selv i form af triggere eller andre bivirkninger), er det sikkert måden er at bruge currval('tbl_tbl_id_seq')
.
Navn på sekvens
strengen literal 'tbl_tbl_id_seq'
i mit eksempel formodes det at være den faktiske navn på sekvensen og castes til regclass
, som rejser en undtagelse, hvis der ikke kan findes en sekvens af dette navn i den aktuelle search_path
.
tbl_tbl_id_seq
er den automatisk genererede standard for en tabel tbl
med en seriel kolonne tbl_id
. Men der er ingen garantier. En kolonnestandard kan hente værdier fra enhver rækkefølge, hvis den er defineret. Og hvis standardnavnet tages ved oprettelse af tabellen, vælger Postgres det næste ledige navn ifølge en simpel algoritme.
Hvis du ikke ved det navnet på sekvensen for en serial
kolonne, skal du bruge den dedikerede funktion pg_get_serial_sequence()
. Kan gøres i farten:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
RETURNING tbl_id;
db<>spil her
Gamle sqlfiddle