Restablecer la clave principal de PostgreSQL a 1

82

¿Hay alguna manera de restablecer la clave principal de una tabla de PostgreSQL para comenzar en 1 nuevamente en una tabla poblada?

Ahora mismo está generando números desde 1000000 en adelante. Quiero que todo se restablezca y comience a 1, manteniendo intactos todos mis datos existentes.

David
fuente

Respuestas:

34

Vea una mejor opción aquí: https://stackoverflow.com/a/5272164/5190

Claves primarias que autoincrement (es decir, columnas con tipo de datos serial primary key) están asociadas con una secuencia . Puede establecer el siguiente valor para cualquier secuencia usando la setval(<seqname>, <next_value>)función. Tenga en cuenta que para ejecutar realmente la función por sí misma, debe usar SELECT, así:SELECT setval(<seqname>, <next_value>)

El nombre de las secuencias creadas automáticamente cuando se usa serial es <table>_<column>_seq

Vinko Vrsalovic
fuente
14
Debe poner "SELECT" delante de la llamada, por ejemplo,SELECT setval('table_id_seq', 10000)
Tom
4
Si lo hago SELECT setval('table_id_seq', 1), cuando inserto un nuevo registro, la identificación toma el valor 2, en lugar de 1. La solución de Paweł Gościcki funciona. (PostgreSQL 9.3)
azulado
@bluish Presumiblemente, lo que sucedió es que el número de secuencia se incrementa antes de que se asigne una nueva clave primaria, es decir. necesitaría restablecerlo a 0. Pero estoy de acuerdo en que la otra solución es mejor de todos modos.
kralyk
189

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

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

Entonces, por ejemplo, para la userstabla sería:

ALTER SEQUENCE users_id_seq RESTART WITH 1
Paweł Gościcki
fuente
21
El WITH 1parámetro es redundante y se puede omitir
Jacek Krawczyk
Esa es la única respuesta correcta, ya que realmente restableció la secuencia.
Balbinator
1
El gran problema de los índices generados automáticamente por la cláusula CREATE TABLE, es que no sabemos el nombre (y el sufijo no lo es seq, puede por, pketc.) ... Pero es fácil en psql por \d my_table_name. O verifique por SQL,SELECT * FROM pg_indexes WHERE tablename like '%my_table_name%'
Peter Krauss
3

@bluish en realidad, insertar un nuevo registro usando una clave primaria autoincrementada, es como usar una secuencia explícitamente de esta manera:

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

Por lo tanto, si desea que la primera identificación sea 1, debe establecer su secuencia en 0. Pero está fuera de los límites, por lo que debe usar la instrucción ALTER SEQUECE. Entonces, si tiene un campo de serie llamado número en el menú de su tabla, por ejemplo:

ALTER SEQUENCE menu_number_seq RESTART

Hará el trabajo a la perfección.

ROQUEFORT François
fuente