dúvida com auto increment...[resolvido]

9 respostas
D

é o seguinte, tenho uma tabela com uma coluna (id) auto increment, até ai tudo bem. Só que eu quero que quando for apagada uma determinada linha do banco, o próximo insert receber o id que foi excluido.
Vou dar um exemplo para vocês entenderem:

supomos que no banco tenha uma tabela assiM:

id Nome
01 Fulano A
02 Fulano B

então eu vou lá e apago o fulano A, ficaria assim:
id Nome
02 Fulano B

porém, eu queria que o fulano B passasse a ser o id 01.
id Nome
01 Fulano B

Teria como fazer isso no banco? ou tem que ser no java?

9 Respostas

Andre_Fonseca

mas porque você precisa disso? aproveitar o id? no banco de dados você tem como pegar o id corrente da sequência e também o próximo id, no Oracle por exemplo você usaria

nextval -> pega o próximo id
currval -> pega o id corrente da sequência

D

andré fonseca, eu preciso disso apenas por questão de “organização”, por exemplo:
tenho uma tabela com mil pessoas cadastradas, dai eu vou lá e apago 200 pessoas, por exemplo apago do 100 ao 300, então minha tabela ficaria com os ids tudo “picado”, e não daria pra saber ao certo quantas pessoas ainda estão cadastradas. é lógico que nesse exemplo que eu citei da pra saber, mas eu digo de uma maneira genérica.

Sei que muitos de vocês irão falar pra mim fazer um count, mas é que eu estou gerando um relatório (no formato xls) com essa tabela (no meu caso é a tabela de clientes) e preciso seguir uma sequencia de ids para que o meu relatório fique mais organizado. Espero que tenha me entendido
Obs: estou usando mysql.

E

david.jv:
é o seguinte, tenho uma tabela com uma coluna (id) auto increment, até ai tudo bem. Só que eu quero que quando for apagada uma determinada linha do banco, o próximo insert receber o id que foi excluido.

Isso costuma ser uma péssima idéia. Por exemplo, se esse ID é uma chave estrangeira em outra tabela, se você não sair caçando todas as tabelas e atualizá-las todas (por exemplo, removendo os registros que referenciam essa linha removida), você pode ter coisas incoerentes de uma forma ruim. E mesmo um “DELETE CASCADE” na verdade não é a solução perfeita para seus problemas.

Eu sempre costumo usar o exemplo “se o Fernandinho Beira-Mar morrer, você vai querer o número de passaporte reaproveitado dele?” Você nunca mais vai conseguir fazer uma viagem internacional - para provar que você não é o Fernandinho Beira-Mar, você vai ser extraditado seguidas vezes para o Brasil antes disso…

E

david.jv:
Sei que muitos de vocês irão falar pra mim fazer um count, mas é que eu estou gerando um relatório (no formato xls) com essa tabela (no meu caso é a tabela de clientes) e preciso seguir uma sequencia de ids para que o meu relatório fique mais organizado. Espero que tenha me entendido
Obs: estou usando mysql.

Uai, ao gerar o relatório, use algum ORDER BY alguma coisa. Se os IDs estão pulados ou não, não deveria fazer diferença. Você não deve usar o ID como “número da linha do relatório”. Em vez disso, normalmente é possível você usar alguma pseudo-coluna do seu banco para gerar esses números de linhas de relatórios.

D

entanglement, esse não é o meu caso, pois as minhas chaves estrangeiras são outros dados, por exemplo, cliente a chave é o cpf… enfim, vejo que vocês não concordam com a idéia de pegar o id do anterior. Então o que devo fazer para que meu relatório saia organizado?
PS.: Não estou fazendo isso porque eu quero, foi solicitado que faça dessa maneira.

D

Ok galera, vou fazer do jeito que o entanglement disse:

Espero que a porcar… di meu chefe não enxa o saco depois, vocês sabem como é a vida de estagiário.
Vlw pela dica entanglement.

discorpio

Boa tarde a todos.

David, isto é possível fazer, e eu recomendaria fazer isto no banco através de Triggers, contudo seguindo a sugestão do nossa comunidade, qual a finalidade disto e qual a vantagem que isto lhe trará em termos de performance tanto do banco quanto da aplicação :?:

Bom, para fazer isto voce deve levar em consideração vários quesitos:

1º) Geralmente campos auto-incrementos costumam ser chaves primárias, e se a tabela está relacionada a outra, então há chaves estrangeiras. Isto implica dizer que se voce renumerar toda um tabela cujos campos auto-incrementos são chaves primárias de uma tabela primária, terá também que renumerar as chaves estrangeiras da tabela estrangeira, além é claro, de apagar também o registro relacionado que foi deletado na tabela primária, contudo isto não é problema se houver uma Constraint com a opção Update Cascade e Delete Cascade.

2º) Para reposicionar os IDs de uma tabela que teve um índice deletado, o ideal é renumerar os IDs a partir do índice deletado, e renumerar a variável auto-incremento para o último índice renumerado, contudo, se voce estiver fazendo atualizações em pacotes, onde vários registros podem ser deletados de uma vez, ai voce terá que renumerar a tabela a partir do menor índice deletado, e renumerar a variável de auto-incrementação subtraindo tantos quantos forem os índices deletados.

3º) Imagine a queda de performance que o seu banco de dados pode ter se o mesmo é acessado por vários usuários em rede, supondo onde 50 usuários, 10 deles estejam deletando pelo menos entre 5 a 10, registros, enquanto que apenas um esteja querendo inserir um único registro. Logicamente que este único usuário terá que esperar que toda a implementação acima seja executada.

Pelas razões acima expostas, acho que não seja recomendável aproveitar um índice de registro deletado, se a finalidade disto seja apenas por estética do Banco de Dados, onde o que importa é a Performance.

D

discorpio, obrigado pelos conselhos. Eu vou fazer o que o entanglement falou.
O problema é que meu chefe falou pra mim utilizar os ids que foram deletados, mas enfim, vou fazer de outro jeito e ele que se vire depois.

discorpio

Boa tarde a todos.

Olha David, realmente estou de pleno acordo em gênero, número e grau com o Entanglement, imagine voce utilizar o Passaport do Fernando Beira Mar, por outro lado, existe também a hipótese de que reaproveitar não somente a ID, mas também todo o registro deletado, pode lhe trazer algum benefício.

Hein :!: :shock: :!:

Como assim :?:

Voce já imaginou como os Bancos administram as contas de seus clientes :?:

Quando voce abre um conta, esta recebe um número que vai ter uma associação permanente ao seu nome, e quando voce encerra a sua conta, esta não é totalmente deletada do banco de dados, apenas recebe um campo com uma flag do tipo “Cliente Inativo”, isto porque suponhamos que 2 anos depois voce resolve reabrir a sua conta, como voce se sentiria ao descobrir que o banco deletou todos os seus registros, e que eles não faziam a menor importância de tê-lo como cliente :?:

Além disso, em caso de investigação da Receita Federal, como explicaria o banco que deletou o registro de um cliente que está sendo investigado, ainda mais que existem tantas contas de clientes laranjas por aí.

Outra questão de ser levada em conta também quanto a uma possível auditoria dentro da sua empresa, onde voce quer saber se um determinado registro foi deletado por sabotagem, mas como saber qual registro foi deletado e quem o deletou :?:

São estas questões que são fundamentais para o desenvolvimento de sua aplicação, no que tange se vale realmente a pena até mesmo deletar um registro, do que se preocupar com estética de organização do seu banco de dados.

Em caso de voce não querer uma tabela inchada com tantos registro cujos campos estão marcados como deletados, voce ainda tem a opção de criar uma tabela cuja estrutura seja uma clone da tabela original, onde através de uma trigger com a opção “Before Delete”, possa transferir os registros de uma tabela para outra, e ai sim, voce pode aproveitar os IDs que estão tabela auxiliar.

Outro fator que pouca gente conhece, é que em cada tabela de qualquer banco de dados, existem os ponteiros internos que servem para indicar a posição do registro na tabela, e estes sim, são automaticamente renumerados quando há deleção e automaticamente inclementados quando há inserção, através de funções internas do banco. Estes ponteiros podem ser acessados por métodos do objeto ResultSet, conhecido como “getRow()”.

Então, neste último caso, para que se preocupar em criar o auto-increment, se voce configurou a chave primária como o campo “CPF”, e também se preocupar em fazer tanta implementação de código, se o banco já faz tudo isto automaticamente pra você. :?: :idea: 8) :lol:

Criado 20 de novembro de 2010
Ultima resposta 20 de nov. de 2010
Respostas 9
Participantes 4