web-dev-qa-db-fra.com

Options pour récupérer la valeur de séquence actuelle (au moment de l'exécution de la requête)

Comment est-il possible d'obtenir la valeur de séquence actuelle dans postgresql 8.4?

Remarque: j'ai besoin de la valeur d'une sorte de statistique, il suffit de récupérer et de stocker. Rien lié à la concurrence et aux conditions de concurrence en cas d'incrémentation manuelle n'est pas pertinent pour la question.

Remarque 2: la séquence est partagée entre plusieurs tables

Remarque 3: currval ne fonctionnera pas à cause de:

  • Renvoie la dernière valeur obtenue par nextval pour cette séquence dans la session en cours
  • ERROR: currval of sequence "<sequence name>" is not yet defined in this session

Mon idée actuelle est d'analyser DDL, ce qui est bizarre

39
zerkms

Vous pouvez utiliser:

SELECT last_value FROM sequence_name;

Mise à jour : ceci est documenté dans l'instruction CREATE SEQUENCE :

Bien que vous ne puissiez pas mettre à jour une séquence directement, vous pouvez utiliser une requête comme:

SELECT * FROM nom;

pour examiner les paramètres et l'état actuel d'une séquence. En particulier, le champ last_value de la séquence affiche la dernière valeur allouée par une session. (Bien sûr, cette valeur peut être obsolète au moment de son impression, si d'autres sessions effectuent activement des appels nextval.)

76
Daniel Vérité

Si la séquence est utilisée pour des identifiants uniques dans une table, vous pouvez simplement le faire:

select max(id) from mytable;

Le moyen le plus efficace, bien que spécifique à PostgreSQL, est:

select currval('mysequence');

bien que techniquement cela retourne la dernière valeur générée par l'appel à nextval('mysequence'), qui ne peut pas nécessairement être tilisée par l'appelant (et si inutilisée laisserait des espaces dans une colonne id d'incrémentation automatique) .

1
Bohemian