J'essaie de définir une séquence sur une valeur spécifique.
SELECT setval('payments_id_seq'), 21, true
Cela donne une erreur:
ERROR: function setval(unknown) does not exist
L'utilisation 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
setval()
a au moins deux arguments.Réponses:
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.la source
true
signifie que la valeur suivante sera le nombre fourni + 1, dans ce cas 22.false
signifie que la valeur suivante sera le nombre fourni, ou 21. Par défaut, setval se comportera comme s'iltrue
avait été choisi. Plus de détails: postgresql.org/docs/9.6/static/functions-sequence.htmlselect setval
syntaxealter sequence
est que vous pouvez y utiliser des requêtes imbriquées, par exemple pourselect max(id) from payments
.Cette syntaxe n'est valide dans aucune version de PostgreSQL:
ALTER SEQUENCE payments_id_seq LASTVALUE 22Cela fonctionnerait:
ALTER SEQUENCE payments_id_seq RESTART WITH 22;
et équivaut à:
SELECT setval('payments_id_seq', 22, FALSE);
Plus dans le courant manuel
ALTER SEQUENCE
et des fonctions de séquence .Notez que cela
setval()
attend soit(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 fournissez des variables typées à la fonction, vous pouvez avoir besoin de castes de types explicites pour satisfaire la résolution de 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 unRESTART
numéro par défaut , qui est utilisé pour lesRESTART
appels suivants sans valeur. Vous avez besoin de Postgres 8.4 ou version ultérieure pour la dernière partie.la source
ALTER SEQUENCE [sequence] RESTART WITH (SELECT MAX(col) from table);
ne fonctionne pas, alors queSELECT setval('sequence', (SELECT (MAX(col) from table), TRUE);
ça marche. J'obtiens une erreur de syntaxe. (Postgres 9.4)SELECT setval('sequence', (SELECT MAX(col) from table), TRUE);
sinon tes parents ne s'alignent pas.SELECT setval('seq', max(col)) FROM tbl;
Voir: stackoverflow.com/a/23390399/939860Utilisation
select setval('payments_id_seq', 21, true);
setval
contient 3 paramètres:sequence_name
nextval
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 séquence, de la valeur de séquence suivante et de gérer correctement la table 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 leprimary key
de la tablela source
la source
Je n'essaye pas de changer de séquence via
setval
. Mais en utilisant, onALTER
m'a donné comment écrire correctement le nom de la séquence. Et cela ne fonctionne que pour moi:Vérifiez le nom de séquence requis à l'aide de
SELECT * FROM information_schema.sequences;
ALTER SEQUENCE public."table_name_Id_seq" restart {number};
Dans mon cas, c'était
ALTER SEQUENCE public."Services_Id_seq" restart 8;
Il existe également une page sur wiki.postgresql.org où décrit un moyen de générer un script sql pour corriger les séquences dans toutes les tables de la base de données à la fois. Ci-dessous le texte du lien:
Et la sortie sera un ensemble de commandes sql qui ressemblent exactement à ceci:
SELECT SETVAL('public."SocialMentionEvents_Id_seq"', COALESCE(MAX("Id"), 1) ) FROM public."SocialMentionEvents"; SELECT SETVAL('public."Users_Id_seq"', COALESCE(MAX("Id"), 1) ) FROM public."Users";
la source