1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

[RESOLVIDO] Como impedir pulos nos IDS PK do banco de dados MYSQL após erros de inserção?

Edit: Consegui resolver utilizando COALESCE no meu INSERT:

INSERT INTO `database`.`tabela` (`id_tip`, `nome_tip`, `detalhes_tip`) VALUES ((SELECT dt.number FROM (SELECT COALESCE(max(id_tip)+1) AS number FROM tabela) AS dt), 'teste6','teste6');

Obrigado...

Edit titulo antigo:Ajuda para criar Trigger para impedir pulos nos IDs autoincrement.

Com o problema anterior, cheguei a esta conclusão:

Consegui o que eu queria apenas com o comando INSERT:

INSERT INTO `database`.`tabela` (`id_tip`, `nome_tip`, `detalhes_tip`) VALUES ((SELECT dt.number FROM (SELECT COALESCE(max(id_tip),0) +1 AS number FROM tabela) AS dt), 'teste6','teste6');

Mas ainda restou um pequenino detalhe. Este comando funciona perfeitamente, SE eu já tiver uma primeira ROW cadastrada na base de dados, porque o comando busca o ultimo ID cadastrado, e caso não exista, gera erro dizendo que a row não pode estar NULL. Então se eu criar a primeira Row manualmente, o código funciona perfeitamente em seguida para o restante.

Daí me veio a dúvida, será que da pra embutir um IFFNULL neste código, que em vez de buscar o ID MAX, enviaria o valor 1 para gerar a primeira ID? Na minha mente imaginei este código duplicado, o IFFNULL que geraria o ID com valor 1, e após isso pegaria os valores do nome_tip,detalhes_tip, e caso a ROW não estivesse NULL, rodaria a parte do cógido que coloquei acima, pegando o Max Value + 1.

Não consegui entender como montar o IFFNULL, ainda mais embutindo neste código para utilizar na Query do programa Java. Alguma ideia? Obrigado desde já!!!

Boa tarde.

Estou incomodado com uma ocorrência entre meu software e mysql.

Meu software faz um INSERT de um nome e um detalhe em uma tabela no meu banco de dados MYSQL, que tem um ID auto-increment. O que está ocorrendo é: Quando acontece uma falha de Inserção de dados, devido as restrições de campos UQ ou NOTNULL, que me retorna um ERRO no software informando que falhou, na próxima INSERT bem sucedida, gera pulo nos IDs.

Exemplo:

Duas inserções bem sucedidas, uma falha, e outra bem sucedida, a coluna de IDs ficaria assim:

ID: 01, 02, 04.

E queria que ficasse na ordem correta: ID: 01, 02, 03.

Descobri que posso resolver isso com um TRIGGER, porém não sei como cria-lo. Poderiam me ajudar?

CREATE TRIGGER odinswlmanager_bi BEFORE INSERT ON tipos ???

Obrigado desde já!

  • Porque o seu SW não verifica qual é o next valor para inserir antes de submeter a inserção ? desta maneira evitaria o erro no ato de inserir ... outra alternativa seria vc pegar o último valor gravado em sua tabela e acrescentar + 1 , tipo assim: select max(seu id) + 1 from sua tabela...

    Aleksandro   30 de set de 2015
  • Mas nesse caso eu teria que tirar o auto-increment do MySQL, e fazer o software gerar o valor. Como meu software teria várias instâncias atuando com o banco de dados, ao meu ver, o mais seguro seria deixar essa questão em função do próprio Banco, não seria mais seguro assim??? Pois o Trigger estaria dentro do Banco, em vez de no software, certo? Já esse comando do Select Max, eu colocaria ele em um trigger, ou embutir ele no comando INSERT?

    Victor Guiraldelli   30 de set de 2015
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags mysql ou faça a sua própria pergunta.