Tendi.. é que no MySQL não ocorre esse problema. Ele primeiro executa a
query para posteriormente reservar um id para essa query. E também faz
automáticamente o que citei do sequenciamento por grupos, onde no próprio
manual diz que internamente o MySQL faz um MAX(campo) +1, o que daria
perfeitamente para criar uma procedure se for o caso, no postgresql.

Mas tudo bem, o que citei do 'buraco' da sequence foi apenas de curiosidade
mesmo, de repente havia alguma maneira nativa do banco de dados que tivesse
me escapado ao ler o manual. Mas nada que irá influenciar drásticamente no
meu projeto. Infelizmente o problema que citei com meses/dias é outra
situação, mas que foi bem representada dessa maneira, e também não terei
problemas com transações concorrentes pois apenas 1 processo (garantido)
executará a query que me dê um 'novo mês', sendo assim posso implementar uma
procedure que faça o mesmo que o MySQL... MAX(campo) + 1.

Obrigado à todos que responderam pois me ajudaram bastante na compreensão do
que é uma sequence, quando usar etc.

Abraços,
Marcus Fernandez

On 7/31/07, Pablo Sánchez <[EMAIL PROTECTED]> wrote:
>
> Segue
>
> Em 31/07/07, Marcus Fernandez<[EMAIL PROTECTED]> escreveu:
> > Boa tarde,
> >
> > Sempre trabalhei com MySQL, porém tive Oracle na faculdade e gostei
> muito.
> > E, ao meu ver, o único banco livre semelhante ao Oracle, no momento, é o
> > PostgreSQL. Devido à isso, decidi utiliza-lo no meu TCC e pretendo
> continuar
> > utilizando em outros projetos também.
> >
> > Estive estudando sobre sequence e não consegui obter informações a
> respeito
> > de uma dúvida e ao testar a sequence, me gerou outra:
> >
> > 1) Ao fazer um teste de INSERT em uma tabela2 possuindo referência a um
> > campo da tabela1 e, tendo na tabela 2 um campo sequence e, este INSERT
> > incluir um dado não existente na tabela um, houve um erro de
> relacionamento,
> > o que era esperado. No entanto ao fazer um INSERT correto, pude
> verificar
> > que a sequência de números foi pulada, ou seja, foi gerado um id para
> uma
> > query com erro.
> >
> > Sei que os dados devem ser verificados na aplicação para que não ocorra
> erro
> > algum nas queries, no entanto seria prudente que não fosse gerado um id
> para
> > uma query inválida, caso isso venha a ocorrer.
>
> O que acontece é que a transação reserva aquele número para aquela
> query, que, no caso de dar erro, é desfeita, mas o sequenciador já foi
> incrementado. Se outra transação em paralelo ocorrer com sucesso e eu
> decrementar posteriormente, qual seria o problema? Eu acabaria por
> reliberar uma sequencia que está sendo utilizada, o que me causaria
> posteriormente um erro em relação à inserção, pois o campo deve, em
> tese, ser unique. Como isso não causa nenhum dano nas aplicações e é
> até mesmo perigoso fazê-lo, não há um decremento do sequenciador. Isso
> ocorre com qualquer SGDB transacional. Tive as mesmas questões
> aparecendo com bancos SQL Server e Oracle.
>
> > 2) Supondo que eu tenha um conjunto de dados dependente de outro, tal
> como
> > meses em um ano, como é possível gerar uma sequence para meses
> respeitando o
> > grupo ano?
> > Ano  | Mes (auto incrementável)
> > 2007  | 01
> > 2007  | 02
> > 2007  | 03
> > ................
> > 2008  | 01
>
> ? Viajei nessa.
> _______________________________________________
> 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

Responder a