328 votes

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

Utilisation de 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

513voto

NPE Points 169956

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'elle en requiert deux ou trois.

C'est la même chose que SELECT setval('payments_id_seq', 21)

276voto

Erwin Brandstetter Points 110228

Cette syntaxe n'est pas valide dans tout version de PostgreSQL :

ALTER SEQUENCE payments_id_seq LASTVALUE 22

Cela pourrait fonctionner :

ALTER SEQUENCE payments_id_seq RESTART WITH 22;

Et est équivalent à :

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

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

Notez que setval() s'attend soit (regclass, bigint) ou (regclass, bigint, boolean) . Dans l'exemple ci-dessus, je fournis littéraux non typés . Cela fonctionne aussi. Mais si vous introduisez des variables typées dans la fonction, vous pouvez avoir besoin d'une version explicite de transferts de type pour satisfaire la résolution du type de fonction. Comme :

SELECT setval(my_text_variable::regclass, my_other_variable::bigint, FALSE);

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] enregistre une valeur par défaut RESTART numéro, qui est utilisé pour les RESTART appels sans valeur. Vous avez besoin de Postgres 8.4 ou plus pour la dernière partie.

68voto

VaibsVB Points 193

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

setval contient 3 paramètres :

  • Le premier paramètre est sequence_name
  • Le 2ème paramètre est Next nextval
  • Le 3è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, de la valeur de la séquence suivante et de gérer correctement les tableaux de colonnes vides est d'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

10voto

Andrzej Bobak Points 945

Select setval('nom_séquence', valeur_séquence)

6voto

alanextar Points 376

Je n'essaie pas de changer la séquence via setval . Mais en utilisant ALTER On m'a expliqué comment écrire correctement le nom de la séquence. Et cela ne fonctionne que pour moi :

  1. Vérifiez le nom de la séquence requise en utilisant SELECT * FROM information_schema.sequences;

  2. 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ù est décrit un moyen de générer un script sql pour fixer les séquences dans toutes les tables de la base de données en une seule fois. Ci-dessous le texte du lien :

Enregistrez ceci dans un fichier, disons 'reset.sql'.

SELECT 'SELECT SETVAL(' ||
       quote_literal(quote_ident(PGT.schemaname) || '.' || quote_ident(S.relname)) ||
       ', COALESCE(MAX(' ||quote_ident(C.attname)|| '), 1) ) FROM ' ||
       quote_ident(PGT.schemaname)|| '.'||quote_ident(T.relname)|| ';'
FROM pg_class AS S,
     pg_depend AS D,
     pg_class AS T,
     pg_attribute AS C,
     pg_tables AS PGT
WHERE S.relkind = 'S'
    AND S.oid = D.objid
    AND D.refobjid = T.oid
    AND D.refobjid = C.attrelid
    AND D.refobjsubid = C.attnum
    AND T.relname = PGT.tablename
ORDER BY S.relname;

Exécutez le fichier et sauvegardez sa sortie d'une manière qui n'inclut pas l'élément en-têtes habituels, puis exécutez cette sortie. Exemple :

psql -Atq -f reset.sql -o temp
psql -f temp
rm temp

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";

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X