MySQL - AutoIncrement

Fala galera… blza?

Então, setei um campo da minha tabela como AutoIncrement. Estava funcionando normal, até que eu reparei que…

  • Depois que eu apago algumas linhas, a contagem continua continua como se nada tivesse acontecido

Para esclarecer um pouco mais:

3 | Dado3
4 | Dado4
5 | Dado5

Queria que, quando eu apagasse as colunas 3 e 4, ele continuasse contando a partir da coluna 4, mas quando faço isso e insiro novas colunas, acontece:

3 | Dado3
6 | Dado4
7 | Dado5

Alguem pode me ajudar?

Mas esse é o comportamento esperado. Se precisar de reutilizar IDs, não use autoincrement

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 :stuck_out_tongue: ). 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.

Boa tarde colegas !

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.

Abraços.

[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]

http://www.liewcf.com/blog/archives/2004/04/mysql-reset-auto-increament-number/