165 votes

Comment réinitialiser une séquence dans postgres et remplir la colonne id avec de nouvelles données ?

J'ai une table avec plus d'un million de lignes. Je dois réinitialiser la séquence et réaffecter la colonne id avec de nouvelles valeurs (1, 2, 3, 4... etc...). Existe-t-il un moyen simple de le faire ?

8 votes

La vraie question : pourquoi diable voulez-vous faire cela ? On peut supposer que l'ID est la clé primaire, et qu'il n'y a donc aucun avantage à changer la clé primaire. Une clé primaire est une valeur sans signification (dans votre cas, une valeur artificielle). La "renuméroter" ne sert à rien dans une base de données relationnelle.

2 votes

Au départ, l'application fonctionnait localement, puis j'ai copié les données sur la production. Mais id ne commençaient pas à partir de 1. L'ordre s'est donc révélé être le suivant : 150, 151..., 300, 1, 2... Et cela causerait éventuellement des erreurs de duplication d'ids, je suppose, si je n'avais pas renuméroté les ids. De plus, l'ordre par id est généralement meilleure que la commande par created_at . Et voici ce qui a marché pour moi .

0 votes

Le but est de pouvoir continuer à utiliser un entier normal au lieu d'un bigint pour une clé primaire dans une base de données qui continue à incrémenter la clé séquentielle mais qui reçoit constamment de nouvelles données. Vous atteindrez rapidement la limite des entiers signés, et si la conservation de l'identifiant existant n'est pas importante, ce processus vous ramènera à des nombres d'identifiants gérables.

262voto

Si vous ne souhaitez pas conserver l'ordre des ids, vous pouvez alors

ALTER SEQUENCE seq RESTART WITH 1;
UPDATE t SET idcolumn=nextval('seq');

Je doute qu'il y ait un moyen facile de le faire dans l'ordre de votre choix sans recréer toute la table.

4 votes

Cela ne devrait-il pas être ALTER SEQUENCE seq RESTART WITH 1; ?

6 votes

SELECT setval('seq', 1, FALSE) devrait faire la même chose (ici, le troisième argument, FALSE, fait la magie, car il montre que nextval doit être 1 au lieu de 2)

0 votes

@VassilenDontchev, absolument.

87voto

Oliver Points 880

Avec PostgreSQL 8.4 ou une version plus récente, il n'est pas nécessaire de spécifier l'adresse de l'utilisateur. WITH 1 plus. La valeur de départ qui a été enregistrée par CREATE SEQUENCE ou le dernier défini par ALTER SEQUENCE START WITH sera utilisé (le plus souvent, ce sera 1).

Réinitialiser la séquence :

ALTER SEQUENCE seq RESTART;

Ensuite, mettez à jour la colonne ID de la table :

UPDATE foo SET id = DEFAULT;

Fuente: Docs PostgreSQL

3 votes

Cette solution semble être la meilleure, car elle évite de faire des hypothèses sur la valeur de départ de la séquence.

1 votes

La meilleure réponse pour mon cas aussi. Je combine cette réponse avec celui-ci qui explique la commande ALTER SEQUENCE ... j'ai donc modifié 'seq' par ma table_id_seq où 'mytable' est le nom de ma table et 'id' est le nom de ma colonne série.

48voto

Frank Heikens Points 29270

Réinitialiser la séquence :

SELECT setval('sequence_name', 0);

Mise à jour des dossiers en cours :

UPDATE foo SET id = DEFAULT;

5 votes

Peut avoir une valeur minimale supérieure à 0. (Et la valeur minimale par défaut utilisée par le type serial y CREATE SEQUENCE est 1 !)

27voto

Ali Raza Bhayani Points 395

Juste pour simplifier et clarifier l'utilisation correcte de ALTER SEQUENCE y SELECT setval pour réinitialiser la séquence :

ALTER SEQUENCE sequence_name RESTART WITH 1;

est équivalent à

SELECT setval('sequence_name', 1, FALSE);

L'une ou l'autre des instructions peut être utilisée pour réinitialiser la séquence et vous pouvez obtenir la valeur suivante par nextval('nom_de_la_séquence'), comme indiqué ci-dessous aquí également :

nextval('sequence_name')

25voto

jahmed31 Points 826

La meilleure façon de réinitialiser une séquence pour recommencer à partir du numéro 1 est d'exécuter ce qui suit :

ALTER SEQUENCE <tablename>_<id>_seq RESTART WITH 1

Ainsi, par exemple, pour la table des utilisateurs, ce serait :

ALTER SEQUENCE users_id_seq RESTART WITH 1

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