2010-09-29 18 views
38

Existe-t-il un moyen de réinitialiser la clé primaire d'une table PostgreSQL pour recommencer à 1 sur une table remplie?Réinitialiser la clé primaire PostgreSQL à 1

En ce moment, il génère des nombres à partir de 1000000 et plus. Je veux tout réinitialiser et commencer à 1, en gardant toutes mes données existantes intactes.

Répondre

23

Les clés primaires qui s'auto-incrémentent (c'est-à-dire, les colonnes avec le type de données serial primary key) sont associées à sequence. Vous pouvez définir la valeur suivante pour n'importe quelle séquence en utilisant setval(<seqname>,<next_value>).

Le nom des séquences d'auto créées lors de l'utilisation de série sont <table>_<column>_seq

+9

Vous devez mettre "SELECT" devant l'appel, par exemple, 'SELECT setval ('table_id_seq', 10000)' – Tom

+1

Si je fais 'SELECT setval ('table_id_seq', 1)', quand j'insère un nouveau enregistrer l'id prend la valeur 2, au lieu de 1. [solution de Paweł Gościcki] (http://stackoverflow.com/a/5272164/505893) fonctionne. (PostgreSQL 9.3) – bluish

+0

@bluish Vraisemblablement ce qui s'est passé est que le numéro de séquence est incrémenté avant que la nouvelle clé primaire soit assignée, c'est à dire. vous devez le réinitialiser à 0. Mais je suis d'accord que l'autre solution est meilleure de toute façon. – kralyk

96

La meilleure façon de réinitialiser une séquence de démarrage avec numéro 1 est d'exécuter ce qui suit:

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

Ainsi, par exemple pour la table users ce serait:

ALTER SEQUENCE users_id_seq RESTART WITH 1 
+8

Le paramètre 'WITH 1' est redondant et peut être ignoré –

0

@bluish insertion en fait un nouvel enregistrement en utilisant une clé primaire auto-incrémentée, est jus t comme l'utilisation d'une séquence explicitement cette façon:

INSERT INTO MyTable (id, col1, ...) VALUES (MySeq.nextval(), val1, ...) 

Donc, si vous voulez que le premier identifiant à 1, vous devriez avoir à configurer votre séquence à 0. Mais il est hors limites, vous devez donc utiliser le ALTER SEQUECE déclaration. Donc, si vous avez un champ de série nommé numéro dans votre menu de table, pour exemple:

ALTER SEQUENCE menu_number_seq RESTART 

fera le travail parfaitement.