PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 12/09/2019 09:04:17

jollt
Membre

Problème de sequence "avançant" toute seule

Bonjour,
j'utilise une séquence pour numéroter des objet dans mon application.
Par exemple, les risques doivent avoir comme numéro

GA_1
GA_2
GA_3
GA_4
GA_5
GA_6
GA_7
etc...

j'ai donc une séquence qui me renvoi le prochain numéro.
Pour une raison que je n'arrive pas à déterminer, cette séquence avance toute seule et je me retrouve avec des trous de numérotation

GA_1
GA_2
GA_3
GA_9
GA_10
GA_37
GA_38
GA_39
GA_45
etc...

Comment est-ce possible?

Merci d'avance pour votre aide

Hors ligne

#2 12/09/2019 12:49:01

dverite
Membre

Re : Problème de sequence "avançant" toute seule

C'est un fait connu lié au fait que les séquences ne sont pas transactionnées, et à l'usage d'un cache de séquence.

https://wiki.postgresql.org/wiki/FAQ#Wh … n_abort.3F

La solution est par exemple de mettre en oeuvre sa propre séquence avec une table à une seule ligne. Un code correct est proposé ici:
https://stackoverflow.com/a/9985219/238814

CREATE TABLE thetable_id_counter ( last_id integer not null );
INSERT INTO thetable_id_counter VALUES (0);

CREATE OR REPLACE FUNCTION get_next_id(countertable regclass, countercolumn text) RETURNS integer AS $$
DECLARE
    next_value integer;
BEGIN
    EXECUTE format('UPDATE %s SET %I = %I + 1 RETURNING %I', countertable, countercolumn, countercolumn, countercolumn) INTO next_value;
    RETURN next_value;
END;
$$ LANGUAGE plpgsql;

COMMENT ON get_next_id(countername regclass) IS 'Increment and return value from integer column $2 in table $1';

Hors ligne

Pied de page des forums