7
votes

Déterminer si la table a des valeurs d'incrémentation automatique d'identité primaire consécutives

Y a-t-il un moyen de déterminer si une table, une très grande table éventuellement, a des identifiants de clé primaire d'incrémentation automatique contiguës / consécutifs? Y a-t-il un moyen de requête SQL pour déterminer cela? Supposons que quelqu'un supprime des rangées au hasard d'une très grande table. J'ai besoin de savoir que cela s'est passé. XXX

Curieux de l'intégrité des données. Je veux une méthodologie de requête SQL afin de garder des choses simples et de ne pas avoir à écrire un script PHP pour fonctionner contre la base de données.


0 commentaires

3 Réponses :


3
votes

Utilisez un auto rejoindre

SELECT *
FROM t t1
LEFT JOIN t t2 ON t2.ID = t1.ID + 1
WHERE t2.ID IS NULL


2 commentaires

Si vous devez connaître le début et la fin de chaque île, vous devriez pouvoir le faire avec une seule analyse de la table et aucune jonction si vous utilisez des variables utilisateur. Semblable à la plus grande approche du groupe.


Technique similaire à ici xaprb.com / Blog / 2006/12/02 / / How-to-Number-Rows-in-MySQL



4
votes

Que diriez-vous: Comptez le nombre de lignes, soustrayez l'identifiant le plus bas du plus haut et si les deux numéros correspondent, les identifiants sont contigus.


0 commentaires

11
votes

Vous pouvez comparer ces deux valeurs: xxx

si la table est toujours contiguë, elles seront identiques.


2 commentaires

Je ne suis pas sûr qu'il soit nécessaire de déterminer la différence de min (ID) et max (id). Comparaison max (id) à compte () devrait suffire à déterminer si elle est ou non. Par exemple, SELECT (MAX (ID) - COUNT (*)) Dans le tableau où 0 signifie contigu et> 1 est l'enregistrement numérique manquant.


@TREFFYNNON: En supposant que la table ID commence par 0 ou des nombres positifs. Si pour une raison quelconque, cela commence négativement - ce qu'il peut - alors vous devez réellement comparer la différence.