Amigão, eu tive que implementar este código tempos atrás:
select setval('servico_pessoal_sequencia_seq',
(select max(sequencia) from servico_pessoal) + 1);
Assim, você pode redefinir o último valor.
Acho que essa sua teoria jamais vai funcionar porque você já está querendo
fazer o trabalho que o próprio banco já
faz (com muita eficiência) com código totalmente testado e funcional.
em vez de ficar tentando reinventar a roda, porque você não coloca a busca da
sequencia para se feita no insert?
E você não precisa de 2 comandos para implementar.
Olha só: insert into tabela (campo1, campo2, chaveincremental) values
(:campo1,:campo2, nextval(‘minha_sequence’);
Quando serão perdidos números de sequência desta forma, se aqui seria o último
passo antes do commit?
Lembre-se, um roolback restaura o registro no seu estado anterior. Assim, em
caso de falha, sua sequence também volta
ao estado anterior.
Por fim, olha o tamanho do int4:
Whole integer values, –2147483648 to +2.147.483.647
From: Matheus de Oliveira
Sent: Thursday, May 31, 2012 10:23 PM
To: Comunidade PostgreSQL Brasileira
Subject: Re: [pgbr-geral]Dica sobre sequência sem usar campo serial.
2012/5/31 Marco Aurélio V. da Silva <[email protected]>
Caros,
Não lembro se esse assunto já foi discutido na lista, mas vamos lá. Estou
desenvolvendo um sistema que terá vários cadastros com numeração sequencial
gerada pelo sistema, mas preciso evitar ao máximo ter furos na sequência. O
sistema é multiusuario, e há a possibilidade de vários usuários fazendo
cadastro ao mesmo tempo.
A lógica que desenvolvi é o seguinte, uma função (vb.net+npgsql) que pega uma
determinada tabela e busca qual o maior codigo dela ai a função soma mais 1 e
adiciona o novo registro, logo a função é composta por dois comandos um select
para pegar o ultimo codigo, e um insert para inserir a nova numeração.
Fazendo um stress teste na função com 3 usuários, só apos 115 tentativas
dando enter ao mesmo tempo na tela conseguimos duplicar um número, mas fazendo
um programa que faz um for de 1 a 200 da função rodando em tres maquinas ao
mesmo tempo deu mais ou menos uns 30% de duplicidade. Adicionando um sleep de
0,1 segundo antes de cada select a duplicidade caiu para 15% mas ainda ocorreu.
Isso não vai dar certo dessa forma, desista. O que pode ser feito é gerar um
lock ao pegar o valor, e liberá-lo após inserir/atualizar os dados.
Você pode fazer isso usando o SELECT ... FOR UPDATE.
Existe alguma possibilidade de melhorar isto sem usar sequence ? A sequence
me gera o seguinte problema, o usuario entra na tela de cadastro e desiste, ai
excluo este numero para reaproveitar se ninguem ja tiver incluido um numero
maior.
Posso fazer o controle de duplicidade tb, mas ai teria que ficar tratando a
mensagem de erro.
Tem alguma outra forma ?
Não basta gerar o valor da sequência apenas quando for realmente inserir o
registro, e não quando abre a tela?
Atenciosamente,
--
Matheus de Oliveira
Bacharelado em Ciências de Computação
Laboratório de Computação de Alto Desempenho - LCAD
Instituto de Ciências Matemáticas e de Computação - ICMC
Universidade de São Paulo - USP
--------------------------------------------------------------------------------
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral