GARANTIR DESCONTO

Fórum Como reiniciar a contagem de um campo serial? #26286

05/04/2005

0

Olá Pessoal!

Estou migrando o banco de dados MySQL para PgSQL. Estou enfrentado a seguinte dúvida:
´No MySQL, uso a seguinte estrutura:
1. tabela master:
- codigo (A) - chave primária;
2.tabela detalhe:
- codigo (A) - chave estrangeira tabela master
- sequencia(+) - auto incremento
(chave primária = codigo+sequencia).
No MySQL, a sequencia(+) é zerada para código diferentes, por exemplo:
codigo sequencia
001 01
001 02
002 01
003 01
Testei no PgSQL e não funcionou da mesma forma, ou seja, o campo SERIAL não foi zerado para códigos diferentes. Isso é assim mesmo, ou existe alguma configuração no PgSQL que possibilita zerá-lo?

Silbene


Eneblis

Eneblis

Responder

Posts

01/09/2005

Lucianobarreto

ALTER SEQUENCE ´public´.´nome_do_sequenciador´
INCREMENT 1 MINVALUE 1
MAXVALUE 9223372036854775807 RESTART 1
CACHE 1 NO CYCLE;


Responder

Gostei + 0

01/09/2005

Eneblis

ALTER SEQUENCE ´public´.´nome_do_sequenciador´ INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 RESTART 1 CACHE 1 NO CYCLE;


Olá Luciano!

Este procedimento reinicia a sequencia para campos diferentes? Como por exemplo:
ID SEQ
01 01
01 02
[i:9b1becf7d4][color=red:9b1becf7d4] 02 01 [/color:9b1becf7d4][/i:9b1becf7d4]

Att.,
Silbene.


Responder

Gostei + 0

01/09/2005

Lucianobarreto

Id é um campo e seq é outro?
É que na verdade o sequence você usa no sql, digamos que voce queira reiniciar somente o id, você usa o
ALTER SEQUENCE "public"."GERADORID" 
INCREMENT 1 MINVALUE 1 
MAXVALUE 9223372036854775807 RESTART 1 
CACHE 1 NO CYCLE;


e no sql fica a mesma coisa nextval(´GERADORID´).

Se nao for o caso voce zera os dois.

Eu não entendi muito bem sua pergunta, caso não seja isso retorne explicando um pouco melhor para eu entender blz?
Até mais


Responder

Gostei + 0

01/09/2005

Lucianobarreto

Eu reli a perguna e agora que entendi..... desculpe a falha.....
O que voce pode fazer é o seguinte.. quando for uma nova inserção, voce zera o sequence do detalhe, ai ele comeca do um. Quando for o caso de um detalhe já existente voce seleciona o ultimo registro e usa o seguinte:
ALTER SEQUENCE "public"."nome_do_sequenciador" 
INCREMENT 1 MINVALUE 1 
MAXVALUE 9223372036854775807 START :Param_Ultimo 
CACHE 1 NO CYCLE;


Entendeu?

PS.: Desculpe a falha, eu nao entendi de começo... :oops:


Responder

Gostei + 0

01/09/2005

Eneblis

Eu reli a perguna e agora que entendi..... desculpe a falha..... O que voce pode fazer é o seguinte.. quando for uma nova inserção, voce zera o sequence do detalhe, ai ele comeca do um. Quando for o caso de um detalhe já existente voce seleciona o ultimo registro e usa o seguinte:
ALTER SEQUENCE "public"."nome_do_sequenciador" 
INCREMENT 1 MINVALUE 1 
MAXVALUE 9223372036854775807 START :Param_Ultimo 
CACHE 1 NO CYCLE;
Entendeu? PS.: Desculpe a falha, eu nao entendi de começo... :oops:


Vamos supor que eu queria guardar por ordem, a sequencia de lançamentos do dia, num sistema financeiro. Exemplo:
Campos:
[u:82dd318f38]DATA[/u:82dd318f38]: 99/99/9999
[u:82dd318f38]SEQ[/u:82dd318f38]: ordem sequencial no dia;
[u:82dd318f38]HIS[/u:82dd318f38]: Histórico do lançamento;

Ao gerar dados teríamos:
DATA SEQ HIS
01/09/2005 1 ´Recto´
01/09/2005 2 ´Pagto´
02/09/2005 1 ´Pagto´;
02/09/2005 2 ´Recto´;
02/09/2005 3 ´Pagto´;

Ou seja, eu tería o campo ´[u:82dd318f38]SEQ[/u:82dd318f38]´, como sequencial, porém tendo a sequencia zerada e sequenciada para valores diferentes de datas.
No MySQL, quando vc define DATA e SEQ como chaves da tabela, e o SEQ como sendo auto-incremento, ele já gera e zera automaticamente, como no exemplo acima especificado.
Eu gostaria de fazer isso também no Postgre.

Espero ter esclarecido,

Aguardo respostas,

:wink: Saudações Cordiais,

Silbene.


Responder

Gostei + 0

01/09/2005

Eneblis

Eu reli a perguna e agora que entendi..... desculpe a falha..... O que voce pode fazer é o seguinte.. quando for uma nova inserção, voce zera o sequence do detalhe, ai ele comeca do um. Quando for o caso de um detalhe já existente voce seleciona o ultimo registro e usa o seguinte:
ALTER SEQUENCE "public"."nome_do_sequenciador" 
INCREMENT 1 MINVALUE 1 
MAXVALUE 9223372036854775807 START :Param_Ultimo 
CACHE 1 NO CYCLE;
Entendeu? PS.: Desculpe a falha, eu nao entendi de começo... :oops:


:lol: Ok, vou testar!!!
:?: Mas só uma pergunta antes: pode haver problemas de concorrência?!

Silbene


Responder

Gostei + 0

01/09/2005

Lucianobarreto

Bom, agora entendi.
Eu faria assim, no inicio de cada dia eu reiniciar o sequence.
Mas digamos que por um motivo qualquer você nao tivesse fechado o caixa, algo que nao poderia deixar o sequence ser iniciado, ai você faria um count na tabela e so iria estar iniciando o sequence do 1 caso nao tivesse nenhuma ocorrencia da data que você estivesse inserindo naquele momento. Caso já tivesse a ocorrencia da data ele comecaria a partir do ultimo registro(ultimo codigo da sequencia) daquela data.
Pelo que entendi seria isso, caso contrário manda ai as mensagens...
Até mais


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar