web-dev-qa-db-fra.com

Postgres modifier 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

140
stef

Les parenthèses sont mal placées:

SELECT setval('payments_id_seq', 21, true);  # next value will be 22

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

178
NPE

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 équivaut à:

_SELECT setval('payments_id_seq', 22, FALSE);
_

Plus de détails dans le manuel en cours pour ALTER SEQUENCE et fonctions de séquence .

Notez que setval() attend _(regclass, bigint)_ ou _(regclass, bigint, boolean)_. Dans l'exemple ci-dessus, je fournis des littéraux non typés . Cela fonctionne aussi. Mais si vous introduisez des variables typées dans la fonction, vous aurez peut-être besoin de transtypages explicites pour satisfaire la résolution du type de fonction. Comme:

_SELECT setval(my_text_variable::regclass, my_other_variable::bigint, FALSE);
_

Pour les 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 ultérieurs RESTART sans valeur. Vous avez besoin de Postgres 8.4 ou version ultérieure pour la dernière partie.

155
Erwin Brandstetter

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

setval contient 3 paramètres:

  • Le premier paramètre est sequence_name
  • Le second paramètre est Next nextval
  • Le 3ème paramètre est optionnel.

L'utilisation de true ou de 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

Le meilleur moyen d'éviter de coder en dur le nom de la séquence, la valeur de la séquence suivante et de gérer correctement les tables de colonnes vides, vous pouvez utiliser la méthode ci-dessous:

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 le primary key de la table.

19
VaibsVB
setval('sequence_name', sequence_value)
8
Andrzej Bobak