118 votes

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

Comment obtenir la valeur de séquence actuelle dans postgresql 8.4 ?

Note : J'ai besoin de la valeur pour une sorte de statistiques, simplement récupérer et stocker. Rien à voir avec les problèmes de concurrence et les conditions de course en cas de l'incrémenter manuellement n'est pas pertinent pour la question.

Note 2 : La séquence est partagée entre plusieurs tables

Note 3 : currval ne fonctionnera pas en raison de :

  • Renvoie la valeur la plus récemment obtenue par nextval pour cette séquence dans la session en cours
  • ERREUR : currval de la séquence "" n'est pas encore défini dans cette session

Mon idée actuelle : est de parser le DDL, ce qui est étrange

236voto

Daniel Vérité Points 15675

Vous pouvez utiliser:

SELECT last_value FROM sequence_name;

Mise à jour: c'est documenté dans la déclaration CREATE SEQUENCE:

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

SELECT * FROM name;

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 n'importe quelle session. (Bien sûr, cette valeur pourrait être obsolète au moment de son affichage, si d'autres sessions font activement des appels nextval.)

17voto

Bohemian Points 134107

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

select max(id) from mytable;

La manière la plus efficace, bien que spécifique à postgres, est :

select currval('mysequence');

bien que techniquement cela renvoie la dernière valeur générée par l'appel à nextval('mysequence'), qui ne sera peut-être pas nécessairement utilisée par l'appelant (et si elle n'est pas utilisée, elle laisserait des trous dans une colonne d'identifiant à incrémentation automatique).

12voto

Alexi Theodore Points 31

À partir d'un certain moment, une fonction secrète (qui est non documentée ... encore), fait exactement ceci :

SÉLECTIONNER pg_sequence_last_value('schema.your_sequence_name');

Mise à jour : Il s'avère que cette fonction n'est pas totalement sûre en production. Le nom de la fonction est trompeur - il ne s'agit pas de la dernière valeur émise, mais plutôt de la dernière valeur sauvegardée/mise en cache sur le disque. Cela signifie qu'elle peut afficher des nombres plus élevés que la réalité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X