Estou tentando definir uma sequência para um valor específico.
SELECT setval('payments_id_seq'), 21, true
Isso dá um erro:
ERROR: function setval(unknown) does not exist
Usar ALTER SEQUENCE
também não parece funcionar?
ALTER SEQUENCE payments_id_seq LASTVALUE 22
Como isso pode ser feito?
Ref: https://www.postgresql.org/docs/current/static/functions-sequence.html
setval()
tem pelo menos dois argumentos.Respostas:
Os parênteses estão fora do lugar:
Caso contrário, você está ligando
setval
com um único argumento, enquanto isso requer dois ou três.fonte
true
significa que o próximo valor será o número fornecido + 1, neste caso 22.false
significa que o próximo valor será o número fornecido, ou 21. Por padrão, setval se comportará como se tivessetrue
sido escolhido. Mais detalhes: postgresql.org/docs/9.6/static/functions-sequence.htmlselect setval
sintaxealter sequence
é que você pode usar consultas aninhadas, por exemplo, paraselect max(id) from payments
.Esta sintaxe não é válida em nenhuma versão do PostgreSQL:
Isso funcionaria:
e é equivalente a:
Mais no manual atual para funções
ALTER SEQUENCE
e sequência .Observe que
setval()
espera um(regclass, bigint)
ou(regclass, bigint, boolean)
. No exemplo acima, estou fornecendo literais sem tipo . Isso também funciona. Mas se você alimentar variáveis digitadas para a função, poderá precisar de conversão explícita de tipos para satisfazer a resolução do tipo de função. Gostar:Para operações repetidas, você pode estar interessado em:
START [WITH]
armazena umRESTART
número padrão , usado paraRESTART
chamadas subseqüentes sem valor. Você precisa do Postgres 8.4 ou posterior para a última parte.fonte
ALTER SEQUENCE [sequence] RESTART WITH (SELECT MAX(col) from table);
não funciona, enquantoSELECT setval('sequence', (SELECT (MAX(col) from table), TRUE);
que funciona. Eu recebo um erro de sintaxe. (Postgres 9.4)SELECT setval('sequence', (SELECT MAX(col) from table), TRUE);
caso contrário, seus parênteses não se alinham.SELECT setval('seq', max(col)) FROM tbl;
Veja: stackoverflow.com/a/23390399/939860Usar
select setval('payments_id_seq', 21, true);
setval
contém 3 parâmetros:sequence_name
nextval
O uso de true ou false no terceiro parâmetro de setval é o seguinte:
A melhor maneira de evitar a codificação do nome da sequência, o valor da próxima sequência e o tratamento correto da tabela de colunas vazias, você pode usar da seguinte maneira:
onde
table_name
é o nome da tabela,id
é oprimary key
da tabelafonte
fonte
Não tento alterar a sequência via
setval
. Mas usandoALTER
I foi emitido como escrever o nome da sequência corretamente. E isso só funciona para mim:Verifique o nome da sequência necessária usando
SELECT * FROM information_schema.sequences;
ALTER SEQUENCE public."table_name_Id_seq" restart {number};
No meu caso foi
ALTER SEQUENCE public."Services_Id_seq" restart 8;
fonte