RETURNING
Dat kan met een enkele retour naar de database:
INSERT INTO tbl(filename)
VALUES ('my_filename')
RETURNING tbl_id;
tbl_id
zou typisch een serial
. zijn of IDENTITY
(Postgres 10 of later) kolom. Meer in de handleiding.
Expliciet waarde ophalen
Als filename
moet tbl_id
. bevatten (overtollig), u kunt nog steeds een enkele zoekopdracht gebruiken.
Gebruik lastval()
of de meer specifieke currval()
:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval('tbl_tbl_id_seq') -- or lastval()
RETURNING tbl_id;
Zie:
- Referentiewaarde van seriële kolom in een andere kolom tijdens dezelfde INSERT
Als er meerdere sequenties in het proces kunnen worden gevorderd (zelfs door middel van triggers of andere bijwerkingen), is het zeker manier is om currval('tbl_tbl_id_seq')
. te gebruiken .
Naam van reeks
De letterlijke tekenreeks 'tbl_tbl_id_seq'
in mijn voorbeeld wordt verondersteld de werkelijke . te zijn naam van de reeks en wordt gecast naar regclass
, die een uitzondering oplevert als er geen reeks van die naam kan worden gevonden in het huidige search_path
.
tbl_tbl_id_seq
is de automatisch gegenereerde standaard voor een tabel tbl
met een seriële kolom tbl_id
. Maar er zijn geen garanties. Een standaardkolom kan waarden ophalen uit elke volgorde indien zo gedefinieerd. En als de standaardnaam wordt gebruikt bij het maken van de tabel, kiest Postgres de volgende vrije naam volgens een eenvoudig algoritme.
Als u niet weet de naam van de reeks voor een serial
kolom, gebruik dan de speciale functie pg_get_serial_sequence()
. Kan on-the-fly worden gedaan:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
RETURNING tbl_id;
db<>viool hier
Oude sqlfiddle