Restablecer contador de incremento automático en postgres


232

Me gustaría forzar el campo de incremento automático de una tabla a algún valor, intenté con esto:

ALTER TABLE product AUTO_INCREMENT = 1453

Y

ALTER SEQUENCE product  RESTART WITH 1453;
ERROR:  relation "your_sequence_name" does not exist

Soy nuevo en postgres :(

Tengo una mesa productcon Idy namecampo


55
Si es nuevo, ¿por qué no usar pgAdmin e inspeccionar los comandos que generará?
razón

1
Por lo general, las tablas se denominan "productos" y no como "producto". En este caso, su secuencia se denominará como "productos_id_seq". Asegúrese de que está buscando una secuencia correcta.
Alexander Gorg

Respuestas:


309

Si creó la tabla productcon una idcolumna, entonces la secuencia no se llama simplemente product, sino más bien product_id_seq(es decir, ${table}_${column}_seq).

Este es el ALTER SEQUENCEcomando que necesitas:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

Puede ver las secuencias en su base de datos usando el \dscomando en psql. Si lo hace \d producty observa la restricción predeterminada para su columna, la nextval(...)llamada también especificará el nombre de la secuencia.


66
No está claro en este mensaje cuál es la sintaxis correcta. Es: ALTERAR SECUENCIA product_id_seq REINICIAR CON 1453;
Liron Yahdav

77
Solo porque analicé mal lo anterior, esta es mi forma de replantear exactamente lo mismo. La sintaxis es ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #, donde "seq" es el texto literal, y pones un número para #. No descuides los guiones bajos. :-)
kmort

2
Tenga en cuenta que si no utiliza el esquema público, es necesario agregar un prefijo con my_schema. ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453
Daniel L. VanDenBosch

¿Alguien sabe por qué ALTERAR SECUENCIA product_id_seq RESTART WITH (SELECT MAX (id) from product); No funciona La única forma que encontré es usar dos consultas separadas.
Chris Huang-Leaver

8
Tenga en cuenta que el valor con el que reinicia es el siguiente valor que desea usar. Entonces, si ya tiene un registro con id 1453, debería hacerlo RESTART WITH 1454.
Hughes

144

Aquí está el comando que está buscando, suponiendo que su secuencia para la tabla de productos sea product_id_seq:

ALTERAR SECUENCIA product_id_seq REINICIAR CON 1453;


130

El siguiente comando hace esto automáticamente por usted: Esto también eliminará todos los datos en la tabla. Así que ten cuidado.

TRUNCATE TABLE someTable RESTART IDENTITY;

21
Cuidado: esto también eliminará todos sus datos
Kibibu

28
@Loolooii, solo lo estoy marcando; Si alguien que no está familiarizado con SQL está buscando aquí porque agregaron manualmente una fila a una tabla con un campo de incremento automático (a través de un ORM, por ejemplo), entonces esta solución probablemente no sea lo que esperan.
kibibu

1
La TABLEpalabra clave es redundante. TRUNCATE someTable RESTART IDENTITY;es suficiente.
usuario1

¿Alguna idea de cómo haría esto con CASCADE?
ihossain

2
@ihossain has intentado TRUNCATE someTable RESTART IDENTITY CASCADE;?
Vedran

55

Para configurar el contador de secuencia:

setval('product_id_seq', 1453);

Si no conoce el nombre de la secuencia, use la pg_get_serial_sequencefunción:

select pg_get_serial_sequence('product', 'id');
 pg_get_serial_sequence 
------------------------
 public.product_id_seq

Los parámetros son el nombre de la tabla y el nombre de la columna.

O simplemente emita un mensaje \d producten el psqlindicador:

=> \d product
                         Table "public.product"
 Column |  Type   |                      Modifiers                       
--------+---------+------------------------------------------------------
 id     | integer | not null default nextval('product_id_seq'::regclass)
 name   | text    | 

14

- Cambiar el valor inicial de la secuencia

ALTER SEQUENCE project_id_seq RESTART 3000;

Lo mismo pero dinámico:

SELECT SETVAL('project_id_seq', (SELECT MAX(id) + 1 FROM project));

Estoy de acuerdo en que el uso de un SELECT es inquietante, pero funciona.

Fuente: https://kylewbanks.com/blog/Adding-or-Modifying-a-PostgreSQL-Sequence-Auto-Increment


Si no me equivoco, PG representa sus secuencias con last_value y se llama, comienza en (1, false), luego (1, true), (2, true) ... por lo que MAX (id) + 1 debería ser MAX (id) en lugar de no omitir un id.
Diez

También tuve que reiniciar mi instancia de postgres para que esto funcione. brew services restart postgresql
BigRon

SELECT SETVAL ('project_id_seq', (SELECT MAX (id) + 1 FROM project)); Funciona perfectamente Pero, ¿hay alguna manera de restablecer el valor de incremento a 0. Entonces, las nuevas entradas comienzan con un índice 0?
Charith Jayasanka

13

Convertido de comentario por conveniencia del visitante

No está claro en este mensaje cuál es la sintaxis correcta. Es:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

6

si desea restablecer el incremento automático desde la GUI, siga estos pasos.

  1. Ve a tu base de datos
  2. Haga clic en público
  3. en la página de Listado de tablas, puede ver TABS como 'Tablas', 'Vistas', 'Secuencias' así.
  4. Haga clic en secuencias
  5. Cuando hace clic en 'Secuencias', puede ver todo el Listado de Secuencias, haga clic en cualquiera que desee Restablecer
  6. Después de eso, puede ver opciones múltiples como 'Alterar', 'Establecer valor', 'Reiniciar', 'Restablecer', etc.
  7. luego haga clic en Restablecer , luego agregue una Nueva fila.

6

Si tiene una tabla con una columna IDENTIDAD en la que desea restablecer el siguiente valor, puede usar el siguiente comando:

ALTER TABLE <table name> 
    ALTER COLUMN <column name> 
        RESTART WITH <new value to restart with>;

1
One + para usabilidad en caso de que no haya sequenceo NO pueda truncar la tabla. Creo que es la mejor respuesta
ABS

5

Para restablecer el incremento automático, debe obtener su nombre de secuencia mediante la siguiente consulta.

Sintaxis:

SELECT pg_get_serial_sequence(‘tablename’,  columnname‘);

Ejemplo:

SELECT pg_get_serial_sequence('demo', 'autoid');

La consulta devolverá el nombre de secuencia del autoid como "Demo_autoid_seq". Luego use la siguiente consulta para restablecer el autoid

Sintaxis:

ALTER SEQUENCE sequenceName RESTART WITH value;

Ejemplo:

ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;

3

Para obtener el id de secuencia use

SELECT pg_get_serial_sequence('tableName', 'ColumnName');

Esto le dará una identificación de secuencia como tableName_ColumnName_seq

Para obtener el último número de semilla, use

select currval(pg_get_serial_sequence('tableName', 'ColumnName'));

o si sabe que la identificación de secuencia ya la usa directamente.

select currval(tableName_ColumnName_seq);

Te dará el último número de semilla

Para restablecer el uso del número de semilla

ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45

1

Use esta consulta para verificar cuál es la clave de secuencia con esquema y tabla,

SELECT pg_get_serial_sequence('"SchemaName"."TableName"', 'KeyColumnName'); // output: "SequenceKey"

Use esta consulta para aumentar el valor de incremento uno por uno,

SELECT nextval('"SchemaName"."SequenceKey"'::regclass); // output 110

Al insertar en la tabla, el siguiente valor incrementado se usará como la tecla (111).

Use esta consulta para establecer un valor específico como el valor incrementado

SELECT setval('"SchemaName"."SequenceKey"', 120);

Al insertar en la tabla, el siguiente valor incrementado se usará como la tecla (121).


0

Tenga en cuenta que si tiene el nombre de la tabla con '_', se elimina en el nombre de la secuencia.

Por ejemplo, nombre de la tabla: columna de user_tokens: id Nombre de secuencia: usertokens_id_seq

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.