Postgres modifie manuellement la séquence

J’essaie de définir une séquence à une valeur spécifique.

SELECT setval('payments_id_seq'), 21, true 

Cela donne une erreur:

ERROR: function setval(unknown) does not exist

Utiliser ALTER SEQUENCE ne semble pas fonctionner non plus?

 ALTER SEQUENCE payments_id_seq LASTVALUE 22 

Comment cela peut-il être fait?

Réf: https://www.postgresql.org/docs/current/static/functions-sequence.html

Les parenthèses sont mal placées:

 setval('payments_id_seq', 21, true) 

Sinon, vous appelez setval avec un seul argument, alors qu’il en faut deux ou trois.

Cette syntaxe n’est valide dans aucune version de PostgreSQL:

 ALTER SEQUENCE payments_id_seq LASTVALUE 22 

Cela fonctionnerait:

 ALTER SEQUENCE payments_id_seq RESTART WITH 22; 

et est équivalent à:

 SELECT setval('payments_id_seq', 22, FALSE); 

Plus dans le manuel actuel pour ALTER SEQUENCE et les fonctions de séquence .


Pour des opérations répétées, vous pourriez être intéressé par:

 ALTER SEQUENCE payments_id_seq START WITH 22; -- set default ALTER SEQUENCE payments_id_seq RESTART; -- without value 

START [WITH] stocke un numéro RESTART par défaut, utilisé pour les appels RESTART suivants sans valeur. Vous avez besoin de Postgres 8.4 ou version ultérieure pour la dernière partie.

 setval('sequence_name', sequence_value) 

Utilisez select setval('payments_id_seq', 21, true);

setval contient 3 parameters:

  • 1er paramètre est sequence_name
  • 2ème paramètre est Next nextval
  • Le troisième paramètre est facultatif.

L’utilisation de true ou false dans le 3ème paramètre de setval est la suivante:

 SELECT setval('payments_id_seq', 21); // Next nextval will return 22 SELECT setval('payments_id_seq', 21, true); // Same as above SELECT setval('payments_id_seq', 21, false); // Next nextval will return 21 

La meilleure façon d’éviter le codage en dur du nom de la séquence, la prochaine valeur de la séquence et de gérer correctement la table des colonnes vides, vous pouvez utiliser la manière suivante:

 SELECT setval(pg_get_serial_sequence('table_name', 'id'), coalesce(max(id), 0)+1 , false) FROM table_name; 

table_name est le nom de la table, id est la primary key de la table