Postgres altera manualmente la secuencia

Resuelto stef asked hace 12 años • 8 respuestas

Estoy intentando establecer una secuencia con un valor específico.

SELECT setval('payments_id_seq'), 21, true;

Esto da un error:

ERROR: function setval(unknown) does not exist

¿ El uso ALTER SEQUENCEtampoco parece funcionar?

ALTER SEQUENCE payments_id_seq LASTVALUE 22;

¿Cómo se puede hacer esto?

Ref: https://www.postgresql.org/docs/current/functions-sequence.html

stef avatar Jan 05 '12 22:01 stef
Aceptado

Los paréntesis están fuera de lugar:

SELECT setval('payments_id_seq', 21, true);  -- next value will be 22

De lo contrario, estarás llamando setvalcon un solo argumento, mientras que requiere dos o tres.

Esto es lo mismo queSELECT setval('payments_id_seq', 21)

NPE avatar Jan 05 '2012 15:01 NPE

Esta sintaxis no es válida en ninguna versión de PostgreSQL:

ALTER SEQUENCE payments_id_seq LASTVALUE 22

Esto funcionaría:

ALTER SEQUENCE payments_id_seq RESTART WITH 22;

Y es equivalente a:

SELECT setval('payments_id_seq', 22, FALSE);

Más en el manual actual para funciones ALTER SEQUENCEy secuencias .

Tenga en cuenta que setval()espera (regclass, bigint)o (regclass, bigint, boolean). En el ejemplo anterior proporciono literales sin tipo . Eso también funciona. Pero si alimenta variables escritas a la función, es posible que necesite conversiones de tipos explícitas para satisfacer la resolución del tipo de función. Como:

SELECT setval(my_text_variable::regclass, my_other_variable::bigint, FALSE);

Para reiniciar la secuencia de una columna serialo IDENTITYdespués del mayor valor de columna actual (sin siquiera saber el nombre de la secuencia):

SELECT setval(pg_get_serial_sequence('payments', 'id')
            , COALESCE(max(id) + 1, 1)
            , false)
FROM   payments;

Ver:

  • ¿Cómo restablecer la secuencia de clave principal de Postgres cuando no está sincronizada?
  • Columna de tabla de incremento automático

Para operaciones repetidas te puede interesar:

ALTER SEQUENCE payments_id_seq START WITH 22; -- set default
ALTER SEQUENCE payments_id_seq RESTART;       -- without value

START [WITH]almacena un RESTARTnúmero predeterminado, que se utiliza para RESTARTllamadas posteriores sin valor. Necesitas Postgres 8.4 o posterior para la última parte.

Erwin Brandstetter avatar Jan 05 '2012 22:01 Erwin Brandstetter

Usarselect setval('payments_id_seq', 21, true);

setvalcontiene 3 parámetros:

  • El primer parámetro essequence_name
  • El segundo parámetro es Siguientenextval
  • El tercer parámetro es opcional.

El uso de verdadero o falso en el tercer parámetro de setval es el siguiente:

SELECT setval('payments_id_seq', 21);           // Next nextval will return 22
SELECT setval('payments_id_seq', 21, true);     // Same as above 
SELECT setval('payments_id_seq', 21, false);    // Next nextval will return 21

La mejor manera de evitar la codificación rígida del nombre de la secuencia, el siguiente valor de la secuencia y de manejar correctamente la tabla de columnas vacías, puede utilizar la siguiente forma:

SELECT setval(pg_get_serial_sequence('table_name', 'id'), coalesce(max(id), 0)+1 , false) FROM table_name;

donde table_nameesta el nombre de la tabla, ides el primary keyde la tabla

VaibsVB avatar Mar 26 '2018 13:03 VaibsVB