2010-09-29 7 views
38

¿Hay alguna manera de restablecer la clave primaria de una tabla PostgreSQL para que comience nuevamente en 1 en una tabla poblada?Restablecer la clave primaria de PostgreSQL a 1

En este momento está generando números de 1000000 en adelante. Quiero que todo se reinicie y comience a 1, manteniendo todos mis datos existentes intactos.

Respuesta

23

Las claves primarias que se autoincremen (es decir, las columnas con el tipo de datos serial primary key) están asociadas a un sequence. Puede establecer el siguiente valor para cualquier secuencia usando setval(<seqname>,<next_value>).

El nombre de las secuencias de automóviles creado cuando se utiliza en serie son <table>_<column>_seq

+9

Debe colocar "SELECT" al frente de la llamada, por ejemplo, 'SELECT setval ('table_id_seq', 10000)' – Tom

+1

Si hago 'SELECT setval ('table_id_seq', 1)', cuando inserte un nuevo registrar la identificación toma el valor 2, en lugar de 1. [La solución de Paweł Gościcki] (http://stackoverflow.com/a/5272164/505893) funciona. (PostgreSQL 9.3) – bluish

+0

@bluish Presumiblemente, lo que sucedió es que el número de secuencia se incrementa antes de que se asigne una nueva clave principal, es decir. necesitarías restablecerlo a 0. Pero estoy de acuerdo en que la otra solución es mejor de todos modos. – kralyk

96

La mejor manera de restablecer una secuencia para iniciar la espalda con el número 1 es ejecutar lo siguiente:

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

Así, por ejemplo, para la tabla users sería:

ALTER SEQUENCE users_id_seq RESTART WITH 1 
+8

El parámetro 'WITH 1' es redundand y se puede omitir –

0

@bluish hecho de insertar un nuevo registro, usando la clave primaria auto-incrementales, es jus t como el uso de una secuencia explícita de esta manera:

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

lo tanto, si desea que la primera identificación sea 1, usted debe tener para establecer su secuencia a 0. Pero es fuera de límites, por lo que debe utilizar el ALTER Declaración SEQUECE. Por lo tanto, si usted tiene un campo en serie llamado número en el menú de la tabla, por exemple:

ALTER SEQUENCE menu_number_seq RESTART 

hará el trabajo perfectamente.

Cuestiones relacionadas