Comment trouver des lacunes dans la numérotation séquentielle dans mysql?

Nous avons une base de données avec une table dont les valeurs ont été importés à partir d'un autre système. Il s'agit d'une auto-incrémentée, et il n'y a pas de doublons, mais il y a des valeurs manquantes. Par exemple, l'exécution de cette requête:

select count(id) from arrc_vouchers where id between 1 and 100

devrait revenir à 100, mais il renvoie 87 au lieu de cela. Est-il une requête je peux courir qui retourne les valeurs des nombres manquants? Par exemple, les enregistrements peuvent exister pour id 1-70 et 83-100, mais il n'y a pas d'enregistrements avec l'identité de 71-82. Je veux retourner 71, 72, 73, etc.

Est-ce possible?

  • Cela peut ne pas fonctionner dans MySQL, mais au travail (Oracle), nous avons besoin de quelque chose de similaire. Nous avons écrit une procédure Stockée qui a eu un certain nombre que la valeur Max. La procédure Stockée a ensuite créé une table temporaire avec une seule colonne. La table contient tous les chiffres de 1 à Max. Puis il a fait un PAS DANS la jointure entre la table temporaire et notre table d'intérêts. Si vous l'avez appelé avec Max = Select max(id) from arrc_vouchers, il serait alors retourner toutes les valeurs manquantes.
  • Quel est le problème avec le fait d'avoir des lacunes dans la numérotation? La valeur d'une clé de substitution n'est généralement pas utile; tout ce qui compte c'est qu'il est unique. Si votre application ne peut pas gérer les non-contigus Id, qui est probablement un bug dans l'application, mais pas dans les données.
  • Dans ce cas, c'est un problème parce que les données que nous avons hérités de l'ancien système de l'auto-incrémenter le numéro associé à un dossier comme une clé pour l'imprimer sur une carte physique qui est remis aux personnes. Ce n'était PAS notre idée. Afin de savoir quelles sont les cartes manquantes, nous avons besoin de savoir où sont les lacunes dans la numérotation séquentielle.
  • xaprb.com/blog/2005/12/06/... select l.id + 1 as start from sequence as l left outer join sequence as r on l.id + 1 = r.id where r.id is null;
  • Vous pouvez utiliser générer des séries de générer des nombres de 1 à la plus haute id de votre table. Ensuite, exécutez une requête où l'id n'est pas dans cette série.
InformationsquelleAutor EmmyS | 2010-12-02