RETURNING
C'est possible avec un seul aller-retour à la base de données :
INSERT INTO tbl(filename)
VALUES ('my_filename')
RETURNING tbl_id;
tbl_id
serait généralement un serial
ou IDENTITY
(Postgres 10 ou version ultérieure). Plus d'informations dans le manuel.
Récupérer explicitement la valeur
Si filename
doit inclure tbl_id
(de manière redondante), vous pouvez toujours utiliser une seule requête.
Utilisez lastval()
ou le plus spécifique currval()
:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval('tbl_tbl_id_seq') -- or lastval()
RETURNING tbl_id;
Voir :
- Valeur de référence de la colonne de série dans une autre colonne lors du même INSERT
Si plusieurs séquences peuvent être avancées dans le processus (même par le biais de déclencheurs ou d'autres effets secondaires), le sûr le moyen est d'utiliser currval('tbl_tbl_id_seq')
.
Nom de la séquence
Le littéral de chaîne 'tbl_tbl_id_seq'
dans mon exemple est censé être le réel nom de la séquence et est converti en regclass
, qui déclenche une exception si aucune séquence de ce nom ne peut être trouvée dans le search_path
actuel .
tbl_tbl_id_seq
est la valeur par défaut générée automatiquement pour une table tbl
avec une colonne de série tbl_id
. Mais il n'y a aucune garantie. Une colonne par défaut peut récupérer des valeurs de tout séquence si elle est ainsi définie. Et si le nom par défaut est pris lors de la création de la table, Postgres sélectionne le prochain nom libre selon un algorithme simple.
Si vous ne savez pas le nom de la séquence pour un serial
colonne, utilisez la fonction dédiée pg_get_serial_sequence()
. Peut être fait à la volée :
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
RETURNING tbl_id;
db<>jouez ici
Vieux sqlfiddle