C'est de par leur conception - tous les SGBD agissent ainsi avec des colonnes à incrémentation automatique.
S'ils ne l'étaient pas, l'intégrité référentielle externe pourrait être endommagée. Pour un exemple simple de cela, imaginez que vous stockez des URL pour un service de raccourcissement en utilisant une colonne d'incrémentation automatique comme clé. Vous ne savez pas si l'URL raccourcie a déjà été distribuée à qui que ce soit, et la base de données ne le fait certainement pas, donc la réutilisation de l'ID 1234 pourrait entraîner la pauvre grand-mère de quelqu'un à visiter somenastypornsite.xxx au lieu de loverlyknitting.org lorsqu'elle clique sur http: / /shortthi.ng/1234 dans un ancien e-mail, au lieu de recevoir un message "Désolé mais ce lien n'existe plus dans nos enregistrements".
De plus, si vous réinitialisez l'incrément après avoir supprimé le dernier élément, allez-vous également effectuer tout le travail (ou vous attendre à ce que la base de données) renumérote tout après le 5ème élément de 5 millions lorsque le 5ème élément est supprimé? compléter avec les modifications apportées à d'autres tables lorsque leurs contraintes de clé étrangère pointent vers la colonne d'incrémentation Un tel travail supplémentaire pourrait devenir très coûteux en termes d'E / S.
Si vous faites réinitialiser le point incrément après la suppression du dernier élément, ne soyez très très prudent de vos niveaux d'isolation de transaction: Vous pouvez réinitialiser tout comme une autre transaction fait usage de la valeur, ce qui conduit à des erreurs (ou pire, échecs silencieux), à moins que vous vous assurez que votre action est entièrement isolée à 100%.
Je recommande généralement aux personnes travaillant avec des bases de données de lire "SQL Antipatterns" qui a un chapitre sur ce problème nommé "Psuedo-Key Neat Freaks" (qui couvre la question d'une manière plus conviviale que le titre du chapitre peut impliquer pour certains!). Essentiellement, si la valeur a une signification au-delà d'être une clé (ou tout au plus transportant des informations d'ordre d'insertion), alors elle ne devrait probablement pas être une colonne à incrémentation automatique, et si elle n'a pas de signification au-delà d'être une clé (ou tout au plus transportant un ordre d'insertion) informations), alors les lacunes ne devraient pas avoir d’importance.