Vous n'êtes pas identifié(e).
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
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';
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne