Agora vou explicar melhor. Por que é que normalmente os bancos não reaproveitam IDs gerados?
Porque é mais rápido e mais fácil, além de escalar melhor, simplesmente contar para frente (a menos que você reinicialize a “sequence”, no caso do Oracle);
Porque esse ID pode ser chave estrangeira de alguma outra tabela, e se você reaproveitasse algum ID, você poderia alguma inconsistência na sua aplicação.
Vou dar um exemplo clássico: seria muito bom se você, ao comprar uma linha de telefone, sempre recebesse um número novo, nunca um reaproveitado, porque pode ser que o número antigamente pertencesse a alguém que recebesse muitas ligações, e talvez ligações incômodas (número do help desk da Microsoft, por exemplo ). Infelizmente, porque os números são em quantidade limitada (mesmo tendo 8 dígitos), não dá para fazer isso.
O que o pessoal costuma fazer nesta seguinte condição:
O banco não reaproveita IDs;
O chefe ou o cliente quer porque quer que você reaproveite IDs (sabe como é que é, não dá para discutir “muito” nesses casos);
Existe apenas uma aplicação que cria IDs novos, sem nenhum paralelismo;
Aí o pessoal usa o tal do SELECT MAX(id) + 1 para obter o novo ID. Mas, como você viu, se houver mais de uma thread ou mais de uma aplicação que crie novos IDs, SELECT MAX(id) + 1 vai dar problemas.
rafael.pierre:
Não sei se entendi a sua necessidade…
Vc disse que tendo os dados:
3 | Dado3
4 | Dado4
5 | Dado5
E ao apagar as linhas:
3 | Dado3
4 | Dado4
Voce queria que “ele continuasse contando a partir da coluna 4”, então nesse caso, o próximo ID seria o 5 ?
Mas veja nos seus dados… o 5 já existe.
Ou você queria que ele gerasse o 3 ?
Mas dai, como foi dito, se você tiver outra tabela onde esse ID é uma chave estrangeira seus dados podem ficar inconsistentes…
A idéia do autoincrement acho que é justamente garantir um ID único para seu registro.
Entendo que reaproveitando esse número essa característica se perderia… acho que convém pensar qual a real finalidade desse numero “reaproveitado” e verificar se ele não seria um atributo comum da sua tabela ao invés de uma PK.
[quote]MySQL: Reset Auto Increament Number
I have a database table with a auto increment column for primary key. As the records being add and delete many times, the auto increment value will keep increasing.
Problem One:
If I have entered 10 records, and deleted 9th, 10th records. The next auto increment value will be 11, not 9.
Solution:
Run a query: ALTER TABLE tablename AUTO_INCREMENT = 1
This will reset the next auto increment value to current largest value in the auto increment column + 1. So, the auto increment value of next inserted record will start from 9.
Problem Two:
If I have entered 10 records, and deleted center records - 4th, 5th. I want to insert next record as 4th not 11th.
Solution:
Run the following query:
SET insert_id = 4;
INSERT INTO tablename VALUES (?blah?, ???);
This will add the next record into record 4th.
The SET insert_id = #(where # is the next auto increment value you want to use) will reset the next auto increament value, the next query(INSERT) you run will use your choice of value.
Note: only effective for the immediate next query, one time. [/quote]