Postgres altera manualmente la secuencia
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 SEQUENCE
tampoco 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
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 setval
con un solo argumento, mientras que requiere dos o tres.
Esto es lo mismo queSELECT setval('payments_id_seq', 21)
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 SEQUENCE
y 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 serial
o IDENTITY
despué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 RESTART
número predeterminado, que se utiliza para RESTART
llamadas posteriores sin valor. Necesitas Postgres 8.4 o posterior para la última parte.
Usarselect setval('payments_id_seq', 21, true);
setval
contiene 3 parámetros:
- El primer parámetro es
sequence_name
- El segundo parámetro es Siguiente
nextval
- 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_name
esta el nombre de la tabla, id
es el primary key
de la tabla