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:
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.
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.
Utiliser select setval('payments_id_seq', 21, true);
setval
contient 3 paramètres:
sequence_name
nextval
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;
où table_name
est le nom de la table, id
est le primary key
de la table.
setval('sequence_name', sequence_value)