PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL prochaine valeur des séquences ?

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