Como fazer auto-incremento no PostGreSql usando String no campo codigo e zeros a esquerda

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.

se puderem me ajudar , desde ja agradeço.

gde abraço a todos…

Dicas,

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.

pensei nisso mais preciso de um ponto de partida.
se vc tiver um exemplo agradeço muito

abraço

Como o mInEiRo disse, mantenha apenas o código não formatado e crie um método que faça a formatação do seu campo. Algo como:

public String formatarNumero(int seuNumero) {
       NumberFormat formatter = new DecimalFormat("00000000");
       return formatter.format(seuNumero);
}

Dai é só aplicar isso sempre que trouxer o código do banco.

[]´s

é isso ai
o método passado funcionará

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.

entendeu?

qualquer dúvida estamos ai.

Não entendi bem onde aplicar esse codigo… vc nao pode fazer um outro exemplo, com legenda explicando as linhas. Por favor…

Alguem me ajude neste trem aqui, por favor…

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 é :frowning:

manda esse negocio ai
talvez ajude
é tudo sql mesmo

[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.

Olá,

primeiramente, o postgresql trabalha com sequence da mesma forma que o Oracle.

Segundo: Não se deve em situação alguma reutilizar chaves primárias, principalmente quando elas não são chaves naturais.

Terceiro: a forma correta e mais indicada para se ter um campo equivalente ao autoincremento e no formato string é:

create table teste ( codigo char(5) not null primary key default to_char(nextval('nome_seq'),'00000'), outro_campo varchar(100) )

O uso de 0 no lugar do 9 em cast, faz com que o postgresql e o oracle coloquem 0 a esquerda de um número.

att

Dieval

Dieval, concordo com vc “em partes”.

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…

grande abraço,