MySQL AUTO_INCREMENT com exemplos
โก Resumo Inteligente
MySQL O atributo AUTO_INCREMENT gera nรบmeros sequenciais automaticamente para uma coluna numรฉrica sempre que uma linha รฉ inserida. Esse atributo elimina a necessidade de calcular identificadores รบnicos manualmente, tornando-se o mรฉtodo padrรฃo para preencher uma chave primรกria.

O que รฉ incremento automรกtico?
O incremento automรกtico รฉ uma funรงรฃo que opera em tipos de dados numรฉricos. Ele gera automaticamente valores numรฉricos sequenciais toda vez que um registro รฉ inserido em uma tabela para um campo definido como incremento automรกtico.
O atributo funciona com qualquer tipo inteiro, de TINYINT a BIGINT. A coluna tambรฉm deve ser indexada, o que acontece automaticamente quando ela รฉ declarada como chave primรกria.
Quando usar incremento automรกtico?
Na liรงรฃo sobre normalizaรงรฃo de banco de dadosAnalisamos como os dados podem ser armazenados com redundรขncia mรญnima, armazenando-os em muitas tabelas pequenas, relacionadas entre si por meio de chaves primรกrias e estrangeiras.
Uma chave primรกria deve ser รบnica, pois identifica exclusivamente uma linha em um banco de dados. Mas como podemos garantir que a chave primรกria seja sempre รบnica?
Uma das possรญveis soluรงรตes seria usar uma fรณrmula para gerar a chave primรกria, que verificaria a existรชncia da chave na tabela antes de adicionar dados. Isso pode funcionar, mas a abordagem รฉ complexa e nรฃo infalรญvel. Duas sessรตes inserindo dados ao mesmo tempo ainda podem ler o mesmo valor mรกximo e entrar em conflito.
Para evitar tal complexidade e garantir que a chave primรกria seja sempre รบnica, podemos usar o MySQL O recurso de incremento automรกtico รฉ usado para gerar chaves primรกrias. O incremento automรกtico รฉ utilizado com o tipo de dados INT. O tipo de dados INT suporta valores com e sem sinal. Os tipos de dados sem sinal sรณ podem conter nรบmeros positivos. Como boa prรกtica, recomenda-se definir a restriรงรฃo de nรฃo sinal na chave primรกria de incremento automรกtico.
Sintaxe de incremento automรกtico
Com o raciocรญnio esclarecido, observe o script usado para criar a tabela de categorias de filmes.
CREATE TABLE `categories` ( `category_id` int UNSIGNED NOT NULL AUTO_INCREMENT, `category_name` varchar(150) DEFAULT NULL, `remarks` varchar(500) DEFAULT NULL, PRIMARY KEY (`category_id`) );
Observe o โAUTO_INCREMENTโ no campo category_id. Isso faz com que o ID da categoria seja gerado automaticamente sempre que uma nova linha for inserida na tabela. Ele nรฃo รฉ fornecido ao inserir dados na tabela. MySQL gera isso.
Observaรงรฃo: A palavra-chave UNSIGNED duplica o intervalo positivo da coluna, e a largura de exibiรงรฃo, uma vez escrita como int(11), estรก obsoleta. MySQL 8.0.17 em diante. Simples int รฉ a forma atual.
Por padrรฃo, o valor inicial de AUTO_INCREMENT รฉ 1 e serรก incrementado em 1 para cada novo registro.
Vamos examinar o conteรบdo atual da tabela de categorias.
SELECT * FROM `categories`;
Executando o script acima em MySQL A anรกlise do Workbench com o banco de dados myflixdb nos fornece os seguintes resultados.
| category_id | category_name | remarks |
|---|---|---|
| 1 | Comedy | Movies with humour |
| 2 | Romantic | Love stories |
| 3 | Epic | Story acient movies |
| 4 | Horror | NULL |
| 5 | Science Fiction | NULL |
| 6 | Thriller | NULL |
| 7 | Action | NULL |
| 8 | Romantic Comedy | NULL |
Existem oito linhas, portanto o prรณximo ID gerado deve ser 9. Agora, vamos inserir uma nova categoria na tabela de categorias, fornecendo apenas o nome.
INSERT INTO `categories` (`category_name`) VALUES ('Cartoons');
Executando o script acima no myflixdb em MySQL bancada nos dรก os seguintes resultados mostrados abaixo.
| category_id | category_name | remarks |
|---|---|---|
| 1 | Comedy | Movies with humour |
| 2 | Romantic | Love stories |
| 3 | Epic | Story acient movies |
| 4 | Horror | NULL |
| 5 | Science Fiction | NULL |
| 6 | Thriller | NULL |
| 7 | Action | NULL |
| 8 | Romantic Comedy | NULL |
| 9 | Cartoons | NULL |
Note que nรฃo fornecemos o ID da categoria. MySQL Foi gerado automaticamente, porque o ID da categoria estรก definido como de incremento automรกtico.
Se vocรช deseja obter o รบltimo ID de inserรงรฃo gerado por MySQL, vocรช pode usar a funรงรฃo LAST_INSERT_ID para fazer isso. O script mostrado abaixo obtรฉm o รบltimo id gerado.
SELECT LAST_INSERT_ID();
A execuรงรฃo do script acima retorna o รบltimo nรบmero de incremento automรกtico gerado pela consulta INSERT. Os resultados sรฃo mostrados abaixo.
Dica: A funรงรฃo LAST_INSERT_ID() tem escopo restrito ร sua prรณpria conexรฃo, portanto, um valor gerado pela inserรงรฃo de outro usuรกrio nunca poderรก ser retornado a vocรช por engano.
Como definir ou redefinir o valor inicial do AUTO_INCREMENT
A sequรชncia padrรฃo comeรงa em 1, mas nem sempre isso รฉ o que um projeto precisa. Os nรบmeros de fatura podem ter que ser mantidos de um sistema antigo, e uma tabela de teste geralmente precisa ser reinicializada. MySQL expรตe o contador diretamente, portanto, ambos os casos sรฃo tratados com uma รบnica clรกusula. Siga estas etapas para controlar o nรบmero inicial.
- Defina o valor no momento da criaรงรฃo. Adicione a clรกusula AUTO_INCREMENT ร instruรงรฃo CREATE TABLE. A primeira linha inserida receberรก esse nรบmero em vez de 1.
- Alterar o valor em uma tabela existente. Uso ALTERAR A TABELA com a mesma clรกusula. MySQL Aceita o novo nรบmero somente se ele for maior que o maior identificador atualmente armazenado.
- Reinicie uma tabela que vocรช tenha esvaziado. O comando TRUNCATE TABLE remove todas as linhas e retorna o contador para 1 em uma รบnica operaรงรฃo, algo que o comando DELETE sozinho nรฃo faz.
- Confirme a alteraรงรฃo. Insira uma linha e leia o identificador de volta com LAST_INSERT_ID() antes de confiar na nova sequรชncia.
-- Start a brand-new table at 1000 CREATE TABLE `invoices` ( `invoice_id` int UNSIGNED NOT NULL AUTO_INCREMENT, `amount` decimal(10,2), PRIMARY KEY (`invoice_id`) ) AUTO_INCREMENT = 1000; -- Move the counter on an existing table ALTER TABLE `categories` AUTO_INCREMENT = 100; -- Empty the table and reset the counter to 1 TRUNCATE TABLE `categories`;
O tamanho do passo tambรฉm pode ser alterado com a variรกvel de sistema `auto_increment_increment`, mas ela se aplica a todo o servidor, e nรฃo a uma tabela especรญfica. ร usada principalmente em replicaรงรฃo, onde dois servidores nรฃo devem gerar o mesmo identificador.
Por que aparecem lacunas em uma sequรชncia AUTO_INCREMENT?
Cedo ou tarde, uma tabela exibirรก identificadores como 1, 2, 5, 6. Nada estรก quebrado. O contador foi projetado para garantir a unicidade, nรฃo para garantir uma sequรชncia ininterrupta de nรบmeros, e nunca emite o mesmo valor duas vezes.
As lacunas surgem pelos seguintes motivos.
- Linhas excluรญdas: Quando uma linha รฉ excluรญda de uma tabela, seu ID autoincrementado nรฃo รฉ reutilizado. MySQL continua gerando novos nรบmeros sequencialmente.
- Transaรงรตes revertidas: O nรบmero รฉ utilizado no momento da inserรงรฃo. Se a transaรงรฃo for revertida, a linha desaparece, mas o nรบmero jรก terรก sido gasto.
- Inserรงรตes com falha: Uma declaraรงรฃo rejeitada por uma restriรงรฃo UNIQUE ainda pode consumir um identificador antes de falhar.
- Inserรงรตes a granel: O InnoDB pode reservar um bloco de nรบmeros para uma inserรงรฃo de vรกrias linhas e descartar aqueles que nรฃo utiliza.
Tentar preencher essas lacunas รฉ um erro. Renumerar as linhas quebra todas as chaves estrangeiras que apontam para elas, e o valor em si nรฃo tem significado para o negรณcio. Se um relatรณrio precisa de uma lista contรญnua, gere o nรบmero da linha na consulta em vez de sobrescrever os dados armazenados.

