Bem-vindos à nossa comunidade!

Junte-se a nós e faça parte hoje mesmo!

O que acontece com o AUTO_INCREMENT caso uma inserção na tabela tenha falhado?

Cadastro
22/6/21
Postagens
133
Curtidas
189
Pontuação
100
Cidade
Canguçu
Recentemente me deparei com uma pergunta muito interessante de um aluno.
Ele estava fazendo alguns testes com as inserções de entradas em uma tabela e tentou inserir entradas inválidas, ao que se seguiu um comportamento interessante: o valor de uma chave AUTO_INCREMENT chamada id pulava um valor quando ele tentava inserir uma entrada inválida, como na imagem abaixo:
1631808648277.png
Bom, antes de ir ao porquê isto acontece, vamos ver como a tabela está definida:
SQL:
CREATE TABLE IF NOT EXISTS cidades (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    nome VARCHAR(255) NOT NULL,
    estado_id int unsigned NOT NULL,
    area DECIMAL(10,2),
    PRIMARY KEY (id),
    FOREIGN KEY (estado_id) REFERENCES estados (id)
    UNIQUE KEY(nome)
);
Aqui temos dois comportamentos muito importantes: A chave id será auto incrementada e não serão aceitas duas cidades com o mesmo nome na tabela.
Supondo que a tabela está completamente vazia e que queremos inserir algumas cidades nela, nós temos que o primeiro item a ser inserido terá o id 1, após isso o campo id será incrementado e o segundo item inserido na tabela terá o id 2, então o campo id é incrementado novamente e o próximo item terá o id 3, e assim por diante. Esse incremento acontece sempre depois de os valores que serão inseridos serem "processados", e antes da tentativa de inserção realmente. Então o que acontece é o que está descrito no trecho abaixo:
SQL:
INSERT INTO cidades (nome, area, estado_id) VALUES ('Campinas', 795, 31) -- id = 1 e atualizado para 2
-- Campinas é adicionada corretamente na tabela. O próximo item terá o id 2.
INSERT INTO cidades (nome, area, estado_id) VALUES ('Campinas', 795, 31) -- id = 2 e atualizado para 3
-- Campinas não é adicionada corretamente na tabela pois esse já é existe uma entrada na tabela com esse nome e o campo nome é unique. O próximo item terá o id 3.
INSERT INTO cidades (nome, area, estado_id) VALUES ('Niterói', 133.9, 25) -- id = 3 e atualizado para 4
--Niterói é adicionado com sucesso na tabela. O próximo item terá o id 4.
Ou seja, quando temos um campo que é AUTO_INCREMENT, o incremento acontecerá independentemente da inserção da entrada na tabela, e se a entrada não for inserida, o campo id neste caso não retorna para o valor anterior ao incremento referente à tentativa de inserção que falhou.
 
Top