Como reiniciar a contagem de um campo serial?
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
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
Curtidas 0
Respostas
Lucianobarreto
05/04/2005
ALTER SEQUENCE ´public´.´nome_do_sequenciador´
INCREMENT 1 MINVALUE 1
MAXVALUE 9223372036854775807 RESTART 1
CACHE 1 NO CYCLE;
INCREMENT 1 MINVALUE 1
MAXVALUE 9223372036854775807 RESTART 1
CACHE 1 NO CYCLE;
GOSTEI 0
Eneblis
05/04/2005
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.
GOSTEI 0
Lucianobarreto
05/04/2005
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
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
É 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
GOSTEI 0
Lucianobarreto
05/04/2005
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:
Entendeu?
PS.: Desculpe a falha, eu nao entendi de começo... :oops:
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:
GOSTEI 0
Eneblis
05/04/2005
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:
Entendeu?
PS.: Desculpe a falha, eu nao entendi de começo... :oops:
ALTER SEQUENCE "public"."nome_do_sequenciador" INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START :Param_Ultimo CACHE 1 NO CYCLE;
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.
GOSTEI 0
Eneblis
05/04/2005
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:
Entendeu?
PS.: Desculpe a falha, eu nao entendi de começo... :oops:
ALTER SEQUENCE "public"."nome_do_sequenciador" INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START :Param_Ultimo CACHE 1 NO CYCLE;
:lol: Ok, vou testar!!!
:?: Mas só uma pergunta antes: pode haver problemas de concorrência?!
Silbene
GOSTEI 0
Lucianobarreto
05/04/2005
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
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
GOSTEI 0