Dúvida com codigo(auto incremento)

21 respostas
S

Eu tenho uma tela de cadastro de cliente…nessa tela tem um campo codigo…e quando eu abrisse ela eu qeria q o proximo codigo do auto incremento do banco fosse setado na caixa de texto “codigo”…tem como eu pegar atravez de uma sql o proximo codigo do auto incremento!?

Desde já agradeço!

21 Respostas

E

Você pode pegar o ultimo código (usando a função MAX do SQL). Depois é só somar +1. Se tiver trabalhando com JTable é mais fácil ainda, e só pegar o código do ultimo cliente e somar + 1.

S

entao mas ai eh q ta…pensa comigo:

exemplo:
eu inseri 5 registros:
cod nome
1 daniel
2 bruno
3 gabriela
4 bruna
5 leticia

ai do jeito q vc disse eu pegaria o ultimo numero(5) e somaria mais um…ficaria 6 …ok…mas vamos supor q eu apague o registro de codigo 5…ai ele pegaria de novo o ultimo numero(4) e somaria mais um…ficaria 5…ai como o codigo eh auto incremento ele iria inserir o numero 6…e do jeito q vc diz eu iria pegar o numero 5…

nao tem um jeito de eu saber qual eh o proximo numero do auto incremento?

R

tem algo como lastid,
mas acho que este do mysql vai pegar o ultimo do auto incremento, e nao como vc está falando…
tem um codigo aí, para quem sabe ajudar,
é com mysql?

S

eu to usando o mysql sim…
entao o q eu preciso eh saber qual eh o proximo codigo do auto incremento…

R

eu ja fiz algo parecido.
mas o lance é esse mesmo, ele sempre vai pegar o ultimo autoincremento, não é que se apagou, ou coisa assim, ele vai no banco, pegar o ultimo que foi feito, e aí soma um…

vc pode fazer uma pesquisa por exemplo por id, de tudo descendente, limitado por um… este vai ser o último colocado…
sabe fazer isto.
e aí soma um…
select * from tabela … ORDER BY id DESC LIMIT 1 …

sempre ser a o ultimo mesmo acrescentado, nao tem jeito. resolveu?
qualquer coisa fala, tenta issso… ja tem implementações…

mas eu acho que eu entendo, vc diz que se apagar o ultimo, ele ira pegar outro, a chance é remota, mas ja vi uma funcao que pega o ultimo mesmo de qualquer jeito, se vc apagou, antes da consulta… o ultimo é o que vc precisa. teste. vou ver se faço teste tambem

T

Olá!

Tome cuidado com sobrecargas do banco!
Pensa comigo: pra pegar o último id vc consulta, pra deletar vc acessa, e pra inserir tb acessa!

Só uma pergunta: se eu "apago" da tabela, não apago do banco? o registro fica ocupando espaço no banco sem ser usado?

Se for assim, quando carregar o programa faça uma função que pega o maior do banco, e carrega ela no início do prgrama.
Quando inserir um registro, coloque outra função do tipo:

int codAutoInc(int maiorRegBanco, Pessoa pessoa){ int ret; if(pessoa.id >= maiorRegBanco){ ret = pessoa.id; }else{ ret = maiorRegBanco; } return ret; }

R

olha eu fiz o teste, com certeza é como eu te falei anteriormente, se vc por acaso deletar o ultimo arquivo,

mas sei entendi o que vc falou… é daí…
ou não mostra o id para a pessoa, afinal o que interessa o id…
ou de fato tem que procurar mais, eu penso…

mas vamos lembrar uma coisa, se voce vai pegar o ultimo numero e somar mais um… este´último número pode substituir o auto increment, pois é o último. e aí o auto_increment, passa até a ser desncessário. o que acha?

afinal o lugar está vazio nao é mesmo.

R

No caso do MySQL e Access (que possuem auto-incremento) não creio que isso seja uma boa prática. (Mostrar o id na tela antes de gravar).

Para bancos como FireBird e Oracle, você trabalha com ‘Sequences’ que acabam com este problema, podendo gerar o ID até mesmo antes de inserir.

Até onde eu sei, o MySQL não possui este recurso de ‘Sequences’.

O problema de mostrar o Id na tela para o usuário é o acesso de outros usuários no mesmo banco de dados ao mesmo tempo…

Pode ser que os id se misturem, tome cuidado com isso.

S

entao vou explicar melhor o q eu qero pra v se vcs entendemmm…bom:

eu tenho um cadastro de cliente…nesse cadastro eh possivel tirar uma foto do cliente atraves de uma webcam…e quando tira a foto o sistema grava a imagem como jpg em uma pasta do projeto…soh q eu tenho q gravar cada imagem com o nome dela relacionado ao cliente q a foto foi tirada…por exemplo…

eu tiro uma foto da cliente ana…ai eu salvo a imagem no projeto com o nome “ana.jpg”…mas podem ter varias anas cadastradas…entao eu qeria em vez de gravar a imagem com o nome da pessoa eu qeria gravar com o codigo dela…ai quando eu clicasse na cliente eu buscaria na pasta do projeto a foto com o codigo dela…ai nao tem erro…mas o problema eh q eu nao consigo saber qual o proximo codigo…e tem o problema tmbm q pode dar erro se varias pessoas estiverem usando o sistemaa…kkk

ta muito complicado isso…se alguem puder ajudar eu agradeço muito!
e brigadao pela ajuda qe vcs ja deram!!

Abraços!

E

Jah pensou em gravar a foto como um campo blob na tabela do cliente?

S

o que seria um campo blob?

S

tem alguma coisa a ver com byte certo?

R

http://dev.mysql.com/doc/refman/4.1/pt/blob.html

S

alguem tem um exemplo do codigo pra eeu jogar a imagem no banco(campo blob)…e um outro para eu receber a imagem do banco?
pq eu dei uma pesquisada aki e nao encontreii…

se alguem ajudar eu agradeço!! hehe

Abraço!

T

Olá!

Se sua necessidade é apenas um identificador, tente a solução que propus anteriormente!

Observe que a parte gráfica deve ser independente… é outra camada da aplicação!

Sua lógica de catalogação de usuários deve ser independente da interface!

Outra coisa: NÃO ARMAZENE IMAGENS EM UM BANCO!
Além de ficar “pesado” o banco, torna suas consultas ineficientes!
Crie campos que armazenem o caminho, seja “hard path” ou “relative path”!

Mais uma coisa: para acesso concorrente, a melhor saída para manter a integridade dos dados e informações é usar uma arquitetura cliente-servidor!

A tela de cadastro e consulta seria um cliente, gerenciado por um servidor que faz o “trabalho sujo”, de escolher o id, cadastrar no banco, etc…

Mas qual sua dúvida em usar auto-incremento?
Se vc definir como PK, será impossível ter chaves duplicadas!
E se vc quiser classificar conforme a data de cadastro, coloque mais uma coluna no banco, com data de cadastro por exemplo!

S

entao…mas para eu salvar o caminho da imagem eu precisaria do nome dela…mas o nome dela eu qero salvar como: “codigodocliente”.jpg…para nao ter problema em futuramente ter nomes iguais…e como eu coloco esse nome se eu nao sei (na hora q eu estou cadastrando) o codigo do cliente? e mesmo se eu pegar o ultimo codigo nao daria certo…pq varias pessoas vao estar usando o programa e pode dar erro de chave…ai eu iria salvar uma imagem em cima da outra…

nao sei se muda alguma coisa…mas a imagem qe eu estou pegando da web cam nao eh grande…eh como se fosse uma foto 3 por quatro…ela tem as dimensões 100x125…ainda mais sendo jpg ela nao deve ser muito pesada…mesmo assim eu nao deveria guarda-las no banco? eu estava pensando em criar uma pasta no proprio projeto para guarda-las…qual a melhor opção?
mas se eu for guarda-las na pasta do projeto eu precisaria saber o codigo do cliente…ai eh q fika dificil…ja se eu for guardar no banco eu nao vou precisar…

qual a melhor maneiira?!

Desde já agradeço!

R

Use o ‘SELECT LAST_INSERT_ID()’ depois que você inserir o registro…

Com essa função você pega o id inserido e coloca no nome do arquivo que você quer.

S

esse “last insert id” eu usaria logo depois q eu cadastrei o usuario!?

e se uma pessoa cadastra um cliente praticamente ao mesmo tempo nao tem como pegar o codigo do outro!?

e o “last insert id” pega o ultimo id inserido no banco inteiro ou na tabela q eu quero?

R

O MySQL vai tratar isso pra você, não se preocupe.

Se você fizer um insert a função LAST_INSERT_ID() estará referenciando a este insert, não importando quantas conexões estão sendo realizadas simultaneamente.

S

blza…vou fazer isso mesmo…depois eu posto aqui o resultado…brigadao pela ajuda!!!

Abraços

T

então…

hard path eh caminho “inflexível”, tipo c:\meu projeto\fotos

Já o relative path eh relativo à sua posição atual!
Tipo .\fotos

Bom, independente do tamanho da foto, acho menos dispendioso pro soft guardar elas fora do banco!
Obviamente nesse caso vc teria problemas quanto ao acesso a estes “dados”, já que alguém poderia ir lá e apagar/modificar uma foto!
Mas se seu soft crescer demais, colocar no banco afeta muito negativamente o desempenho!
Aí está uma decisão gerencial! Se vc sabe q seu soft não vai ter mais de, por exemplo, 200 fotos, às vezes pela questão de segurança compense colocar no banco!

Criado 24 de março de 2010
Ultima resposta 26 de mar. de 2010
Respostas 21
Participantes 5