Olá pessoal estou testando algumas possibilidades para codigo e parai exatamente neste ponto.
Como fazer auto-incremento no PostGreSql usando String no campo codigo e preencher com zeros a esquerda
Já teste o auto-incremento do banco mais verifiquei que sempre complicar quando eu apago um registro, por que o numero uma vez usado não mais servirá fazendo com que a sequencia de codigos fiquem com espaço.
Utilize normalmente o auto-incremente (sequence), mas crie um campo a mais para vc utilizar com o seu codigo formatado.
esse novo campo pode ser um inteiro mesmo. assim vc cria uma rotina para formar com os zeros a esquerda. toda vez que vc for mostrar esse campo, vc formata.
assim vc nao mantem no banco e sim na aplicação.
agora, o mais trabalhoso no caso vai ser manter sempre os registros ordenados sem buracos.
se vc tem 10 registro, e o cara exclui o registro 5, vc tera que atualizar os demais e colocar o novo codigo.
como vc esta usando uma sequence, não vai haver problema de banco, vc nunca vai mudar o valor do campo da sequence. vc so vai mudar o valor do codigo formatado.
quando vc for incluir um novo registro, vc primeiro faz assim:
select max(campo) +1 from tabela
assim vc pega o proximo valor.
quando vc for apagar o registro, primeiro vc pega o valor do campo da sequence, depois vc faz o update a seguir:
update TABELA set CAMPO = CAMPO-1 where SEQUECE > codigoseqeuce
assim vc passa todos os registro maiores que o que vc está excluindo, e passa o campo de codigo para ele - 1.
Quer dizer que, na sua aplicação o Usuário poderá APAGAR registros, e aí vc deseja REAPROVEITAR o valor do mesmo campo em registros novos, certo?
Bom, eu só trabalho com Oracle (que usa sequences, e não campo auto-incremental), e não sei se o PostGres trabalha da mesma maneira!
Como a Sequence do Oracle é um objeto independente do campo da tabela, eu continuaria usando a Sequence (para gerar o código sequencial) em conjunto com um código SQL para pegar esses buracos deixados por registros apagados.
Se fosse em Oracle eu já colocaria o código de como fazer, mas em PostGres eu não sei como é
[quote=parcon]manda esse negocio ai
talvez ajude
é tudo sql mesmo
[/quote]
Eu uso funções específicas do Oracle, caso vc consiga entender e fazer o equivalente em Postgres, fique a vontade, mas não é “tudo SQL” como vc disse.
Com esta query, por exemplo, eu consigo todos os “buracos”:
Select rownum
from sua_tabela
minus
select campo_sequencial
from sua_tabela
Ou seja, se essa query retornar 1 ou mais linhas, eu pego o primeiro valor.
Se não retornar nada, ou seja, nõa tem buracos, eu pego o valor da Sequence.
Concordo que não devemos reaproveitar chave primária depois de um registro ser excluído.
Porém, acho que o colega não citou que o tal campo é uma chave primária.
Portanto, imagino eu que seja apenas um campo Unique Key sequencial, e vou acreditar
que por algum motivo que desconheço ele necessite reaproveitar esses códigos…
Senhores agradeço-vos a ajuda e ambos estão certos, jamais posso reaproveitar um compo codigo sendo a minha chave minha chave primaria e serial. Milton, estou sim a usar um outro campo codigo que devera ser formatado com os zeros a esquerda e este vai sempre ter sua sequencia reaproveitada…
O coluna codigo da chave primaria do banco nao ira aparecer no aplicativo.
Agora se os senhores poderem me passar um exemplos com bastante datalhes, agradeço…