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.

  • ๐Ÿ”ข Comportamento Essencial: AUTO_INCREMENT gera o prรณximo nรบmero da sequรชncia sempre que uma nova linha รฉ inserida, comeรงando em 1 e incrementando.ping em 1.
  • ๐Ÿ”‘ Funรงรฃo principal: O atributo garante um identificador รบnico sem a necessidade de uma consulta de pesquisa, sendo, portanto, a escolha padrรฃo para uma chave primรกria substituta.
  • ๐Ÿงฑ Requisitos da coluna: A coluna deve ser do tipo inteiro e deve ser indexada, o que a declaraรงรฃo PRIMARY KEY jรก satisfaz.
  • โž• Inserir padrรฃo: Omita a coluna de identificador da instruรงรฃo INSERT e MySQL fornece o valor e, em seguida, LAST_INSERT_ID() o retorna.
  • ๐ŸŽš๏ธ Valor inicial personalizado: CREATE TABLE ou ALTER TABLE aceita AUTO_INCREMENT = 10 para iniciar a sequรชncia em um nรบmero escolhido.
  • ๐Ÿ•ณ๏ธ Esperar lacunas: Linhas excluรญdas e transaรงรตes revertidas consomem nรบmeros permanentemente, portanto a sequรชncia permanece รบnica, mas nรฃo contรญgua.

MySQL INCREMENTO AUTOMรTICO

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.

MySQL AUTO_INCREMENT com exemplos

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.

MySQL INCREMENTO AUTOMรTICO

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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.

Perguntas Frequentes

Nรฃo. MySQL Permite exatamente uma coluna AUTO_INCREMENT por tabela, e essa coluna deve ser indexada. Declarรก-la como a chave primรกria satisfaz o requisito do รญndice.

As inserรงรตes falham com um erro de chave duplicada, porque o contador nรฃo consegue ultrapassar o limite mรกximo do tipo de dados. Um TINYINT sem sinal para em 255. Altere a coluna para um tipo mais amplo, como BIGINT, antes desse ponto.

Sim, de MySQL A partir da versรฃo 8.0, o InnoDB grava o contador no log de refazer, de modo que ele รฉ restaurado apรณs uma reinicializaรงรฃo. Versรตes anteriores recalculavam o contador e podiam reemitir nรบmeros liberados por exclusรตes.

Em parte. Assistentes de esquema de IA dentro de ferramentas como MySQL Workbench Sugira um nรบmero inteiro sem sinal com amplitude suficiente para o volume descrito. A estimativa sรณ serรก precisa se a taxa de crescimento fornecida for confiรกvel, portanto, verifique-a.

Muitas vezes, sim. Os assistentes de consulta de IA apontam para transaรงรตes revertidas e falhas. INSIRA declaraรงรตes e linhas excluรญdas sรฃo as causas usuais. Considere a explicaรงรฃo como um ponto de partida e confirme-a com os registros do servidor.

Resuma esta postagem com: