Documentation PostgreSQL 14.22 » Langage SQL » Fonctions et opérateurs » Fonctions de manipulation de séquence

Précédent | Niveau supérieur | Suivant
9.16. Fonctions et opérateurs JSON | Sommaire | 9.18. Expressions conditionnelles

## 9.17. Fonctions de manipulation de séquence

Cette section décrit les fonctions pour opérer sur des objets séquence, aussi appelés des générateurs de séquence ou plus simplement séquences. Les objets séquence sont des tables spéciales à une ligne créées avec l'ordre CREATE SEQUENCE. Les objets séquence sont habituellement utilisés pour générer des identifiants uniques pour les lignes d'une table. Les fonctions pour séquence, listées dans Tableau 9.50, fournissent des méthodes simples, sûres pour la concurrence d'utilisateur, permettent d'obtenir des valeurs successives de séquence à partir d'objets séquence.

Tableau 9.50. Fonctions pour séquence

Fonction Description
`nextval` ( `regclass` ) → `bigint` Avance l'objet séquence à sa prochaine valeur et renvoie cette valeur. Ceci est fait de façon atomique : même si plusieurs sessions exécutent `nextval` en même temps, chacune recevra une valeur distincte de séquence. Si l'objet séquence a été créé avec les paramètres par défaut, les appels successifs à `nextval` renverront les valeurs successives en partant de 1. D'autres comportements peuvent être obtenus en utilisant les paramètres appropriés dans la commande CREATE SEQUENCE. Cette fonction nécessite le droit `USAGE` ou `UPDATE` sur la séquence.
`setval` ( `regclass`, `bigint` [, `boolean` ] ) → `bigint` Configure la valeur actuelle de l'objet séquence, et en option son drapeau `is_called`. La syntaxe à deux paramètres configure le champ `last_value` à la valeur indiquée et configure le champ `is_called` à la valeur `true`, signifiant que le prochain appel à `nextval` avancera la séquence avant de renvoyer la valeur. La valeur qui sera alors rapportée par `currval` est aussi configurée à la valeur indiquée. Dans la syntaxe à trois paramètres, `is_called` peut être configuré à `true` ou à `false`. `true` a le même effet que dans la syntaxe à deux paramètres. S'il est configuré à `false`, le prochain appel à `nextval` renverra exactement la valeur indiqué, et l'avancement de la séquence commence avec le `nextval` suivant. De plus, la valeur renvoyée par `currval` n'est pas modifiée dans ce cas. Par exemple,
    SELECT setval('myseq', 42);           Le prochain nextval renverra 43
    SELECT setval('myseq', 42, true);     Identique
    SELECT setval('myseq', 42, false);    Le prochain nextval renverra 42
Le résultat renvoyé par `setval` est simplement la valeur de son deuxième argument. Cette fonction nécessite le droit `UPDATE` sur la séquence.
`currval` ( `regclass` ) → `bigint` Renvoie la valeur la plus récemment obtenue par `nextval` pour cette séquence dans le session courante. (Une erreur est renvoyée si `nextval` n'a jamais été appelé par cette séquence dans cette session.) Comme cela renvoie une valeur locale à la session, la réponse est prévisible que d'autres sessions aient `nextval` ou pas depuis que la session courant l'a fait. Cette fonction nécessite le droit `USAGE` ou le droit `SELECT` sur la séquence.
`lastval` () → `bigint` Renvoie la valeur la plus récemment renvoyée par la fonction `nextval` dans la session courante. Cette fonction est identique à `currval`, sauf qu'au lieu de prendre le nom de la séquence en argument, elle se réfère à la dernière séquence utilisée avec `nextval` dans la session courante. Une erreur est renvoyé si `lastval` a été appelée alors que `nextval` ne l'a pas été dans la session courante. Cette fonction nécessite le droit `USAGE` ou le droit `SELECT` sur la dernière séquence utilisée.

### Attention

Pour éviter le blocage de transactions concurrentes pour l'obtention de nombres provenant de la même séquence, la valeur obtenue par `nextval` n'est pas réclamée pour une réutilisation si la transaction appelante s'annule après coup. Ceci signifie que des annulations de transaction ou des crashs de bases de données peuvent avoir pour conséquence des trous dans la séquence des valeurs affectées. Ceci peut aussi survenir sans annulation de transaction. Par exemple, un `INSERT` avec une clause `ON CONFLICT` calculera la ligne à insérer, incluant tout appel nécessaire à `nextval`, avant de détecter un conflit qui causera la poursuite sur la règle `ON CONFLICT`. De ce fait, les objets séquences de PostgreSQL ne peuvent pas être utilisés pour obtenir des séquences « sans trou » .

De la même façon, les changements d'état de séquence réalisés par `setval` sont immédiatement visibles aux autres transactions, et ne sont pas annulées si la transaction appelante annule ses modifications.

Si l'instance s'arrête brutalement avant de valider une transaction ayant exécuté un appel à `nextval` ou `setval`, le changement d'état de la séquence pourrait ne pas arriver jusqu'au stockage permanent, donc l'état de la séquence n'est pas certain, qu'il soit à sa valeur d'origine ou à sa nouvelle valeur après le redémarrage de l'instance. Ceci n'est pas grave pour l'utilisation de la séquence dans la base car les autres effets des transactions non valides ne seront pas visibles. Néanmoins, si vous souhaitez utiliser une valeur de séquence pour un stockage persistant hors de la base, assurez-vous que l'appel à `nextval` soit validé avant de l'utiliser hors base.

La séquence à traiter par une fonction de séquence est indiquée par un argument `regclass`, qui est simplement l'OID de la séquence dans le catalogue système `pg_class`. Vous n'avez pas besoin de rechercher l'OID manuellement car le convertisseur en entrée du type de donnée `regclass` fera ce travail pour vous. Voir Section 8.19 pour les détails.