Estoy tratando de establecer una secuencia a un valor específico.
SELECT setval('payments_id_seq'), 21, true
Esto da un error:
ERROR: function setval(unknown) does not exist
¿Usar 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/static/functions-sequence.html
setval()
tiene al menos dos argumentos.Respuestas:
Los paréntesis están fuera de lugar:
De lo contrario, está llamando
setval
con un solo argumento, mientras que requiere dos o tres.fuente
true
significa que el siguiente valor será el número proporcionado + 1, en este caso 22.false
significa que el siguiente valor sería el número proporcionado, o 21. Por defecto, setval se comportará como sitrue
se hubiera elegido. Más detalles: postgresql.org/docs/9.6/static/functions-sequence.htmlselect setval
sintaxisalter sequence
es que puede usar consultas anidadas en ella, por ejemplo, paraselect max(id) from payments
.Esta sintaxis no es válida en ninguna versión de PostgreSQL:
Esto funcionaría:
y es equivalente a:
Más en el manual actual para
ALTER SEQUENCE
y funciones de secuencia .Tenga en cuenta que
setval()
espera(regclass, bigint)
o(regclass, bigint, boolean)
. En el ejemplo anterior, estoy proporcionando literales sin tipo . Eso tambien funciona. Pero si alimenta las variables escritas a la función, puede necesitar conversiones de tipo explícitas para satisfacer la resolución del tipo de función. Me gusta:Para operaciones repetidas puede interesarle:
START [WITH]
almacena unRESTART
número predeterminado , que se utiliza paraRESTART
llamadas posteriores sin valor. Necesita Postgres 8.4 o posterior para la última parte.fuente
ALTER SEQUENCE [sequence] RESTART WITH (SELECT MAX(col) from table);
no funciona, mientrasSELECT setval('sequence', (SELECT (MAX(col) from table), TRUE);
que funciona. Me sale un error de sintaxis. (Postgres 9.4)SELECT setval('sequence', (SELECT MAX(col) from table), TRUE);
contrario tus padres no se alinean.SELECT setval('seq', max(col)) FROM tbl;
ver: stackoverflow.com/a/23390399/939860Utilizar
select setval('payments_id_seq', 21, true);
setval
contiene 3 parámetros:sequence_name
nextval
El uso de verdadero o falso en el tercer parámetro de setval es el siguiente:
La mejor manera de evitar la codificación rígida del nombre de secuencia, el siguiente valor de secuencia y manejar correctamente la tabla de columnas vacía, puede usar la siguiente manera:
donde
table_name
es el nombre de la mesa,id
es elprimary key
de la mesafuente
fuente
No intento cambiar la secuencia a través de
setval
. Pero usandoALTER
me emitieron cómo escribir el nombre de secuencia correctamente. Y esto solo funciona para mí:Verifique el nombre de secuencia requerido usando
SELECT * FROM information_schema.sequences;
ALTER SEQUENCE public."table_name_Id_seq" restart {number};
En mi caso fue
ALTER SEQUENCE public."Services_Id_seq" restart 8;
fuente