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é. 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. P> p>
3 Réponses :
Utilisez un auto rejoindre
SELECT * FROM t t1 LEFT JOIN t t2 ON t2.ID = t1.ID + 1 WHERE t2.ID IS NULL
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
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. P>
Vous pouvez comparer ces deux valeurs: si la table est toujours contiguë, elles seront identiques. p> p>
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) code> à compte () code> devrait suffire à déterminer si elle est ou non. Par exemple, SELECT (MAX (ID) - COUNT (*)) Dans le tableau CODE> où 0 signifie contigu et> 1 est l'enregistrement numérique manquant.
@TREFFYNNON: En supposant que la table ID code> 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.