Por exemplo, se meu ultimo produto tem ID 10 e eu o removo, o próximo produto adicionado deveria ter o ID 10, porém ele recebe o increment e vem com ID 11, e o id 10 é perdido, não sei como arrumar isto.
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Por exemplo, se meu ultimo produto tem ID 10 e eu o removo, o próximo produto adicionado deveria ter o ID 10, porém ele recebe o increment e vem com ID 11, e o id 10 é perdido, não sei como arrumar isto.
Guilherme, é assim mesmo que funciona. Os bancos de dados seguem o gerador de chave, que é incremental. Quando vamos inserir um novo registro, eles não buscam desde o início por uma chave com posição vazia para preencher essa posição. Eles sabem qual foi a última chave gerada e geram a próxima chave, o que é muito mais rápido do que varrer todo o banco de dados em busca de uma chave não utilizada (imagina um BD com 5 milhões de registros).
o campo ID e uma chave auto_increment, então infelizmente nao pode ser reutilizada, para caso você queira isto vai ter que fazer um esquema tipo um if(){} se o campo id tal estiver vago, ele preenche o campo.
você tem que pensa o seguinte em um banco com 3 registros voce vai tem 3 ID, si voce deleta o ID 1 este vai fica vago e si voce fizer um IF para preencher esta vaga voce vai perde o controle de cadastros, um cadastro que era para ser o ultimo lançamento agora é o primeiro.
Como os demais colegas falaram, é assim que os bancos de dados funcionam mesmo, pelo menos todos que eu trabalhei até o momento.
Já passei por casos que deveríamos manter sempre um número sequencial e "recuperar" números perdidos. Nestes casos, utilizamos um outro campo da tabela e o controle é feito pela lógica do programa mesmo, para buscar sempre o menor valor não utilizado.
Mas os campos auto incrementais dos bancos de dados, por questões de segurança, realmente apenas incrementam, nunca "voltam".