Les clés primaires des instances du modèle Django ne sont pas réinitialisées à 1 après la suppression de toutes les instances
Je travaille sur une version hors ligne de mon Django web app et ont fréquemment supprimé instances de modèle pour un certain ModelX.
Je l'ai fait à partir de la page d'administration et n'a pas éprouvé de problèmes. Le modèle n'a que deux champs: le nom et l'ordonnance et pas d'autres relations avec d'autres modèles.
De nouvelles instances sont donnés la prochaine pk qui fait sens, et quand je l'ai supprimé tous les cas, l'ajout d'une nouvelle instance de rendements pk=1, ce qui je pense.
Le déplacement de la ligne de code à ma base de données j'ai remarqué que ce n'est pas le cas. J'avais besoin de changer les instances de modèle donc j'ai supprimé tous, mais à ma grande surprise, les clés primaires conservées sur l'incrémentation sans revenir à la réinitialisation 1.
D'aller dans la base de données en utilisant le Django d'API, j'ai vérifié et les anciennes instances ont disparu, mais même en y ajoutant de nouvelles instances de rendement d'une clé primaire qui reprend là où le dernier supprimés instance de gauche, au lieu de 1.
Demandais si quelqu'un sait ce qui pourrait être question ici.
source d'informationauteur pj2452
Vous devez vous connecter pour publier un commentaire.
Comme d'autres l'ont dit, c'est entièrement de la responsabilité de la base de données.
Mais vous devez réaliser que c'est la souhaitable comportement. Un ID identifie de manière unique une entité dans votre base de données. En tant que tel, il ne doit jamais se référer à une seule ligne. Si cette ligne est supprimée, il n'y a aucune raison de vous en voulez une nouvelle ligne à la ré-utilisation de l'IDENTIFIANT: si vous avez fait cela, vous devez créer une confusion entre la désormais supprimé de l'entité qui l'habitude d'avoir l'IDENTIFIANT, et le nouvellement créé un qui est réutilisée. Il n'y a pas lieu de le faire, et vous devriez en voulez pas le faire.
Je n'appellerais pas ça un problème. C'est le comportement par défaut pour de nombreux systèmes de base de données. Fondamentalement, l'auto-incrémentation du compteur pour une table est persistant, et de supprimer des entrées n'a pas d'incidence sur le comptoir. La valeur réelle de la clé primaire n'affecte pas les performances ou quoi que ce soit, il a seulement une valeur esthétique (si jamais vous atteindre 2 milliards de limite, vous aurez plus de chances d'avoir d'autres problèmes à s'inquiéter).
Si vous voulez vraiment réinitialiser le compteur, vous pouvez supprimer et recréer la table:
Ou, si vous avez besoin de conserver les données à partir d'autres tables dans l'application, vous pouvez réinitialiser manuellement le compteur:
La raison la plus probable que vous voyez des comportements différents dans votre en ligne et hors ligne apps, c'est que l'auto-incrémentation de la valeur n'est enregistrée dans la mémoire, pas sur le disque. Il est recalculé en
MAX(<column>) + 1
chaque fois que le serveur de base de données est redémarré. Si le tableau est vide, il sera complètement remise à zéro sur un redémarrage. C'est probablement très souvent, pour votre hors connexion de l'environnement, et pratiquement aucun en ligne pour votre environnement.Avez-vous réellement supprimer de votre base de données ou avez-vous les supprimer à l'aide de Django? Django ne changera pas
AUTO_INCREMENT
pour votre table, tout en supprimant les lignes, donc si vous voulez réinitialiser votre, clés primaires, vous pourriez avoir à aller dans votre base de données et:(Cela suppose que vous utilisez MySQL ou similaire).
Il n'y a pas de problème, c'est la façon dont les bases de données de travail. Django n'a rien à voir avec la génération ids, elle dit juste la base de données pour insérer une ligne et récupère l'id en réponse à partir de la base de données. L'id commence à 1 pour chaque table et s'incrémente à chaque fois que vous insérez une ligne. La suppression de lignes ne cause pas l'id de revenir en arrière. Vous ne devriez pas généralement être concernés par cela, tout ce que vous devez savoir, c'est que chaque ligne a un id unique.
Vous pouvez bien sûr changer le compteur qui génère l'id de votre table avec une commande de base de données et qui dépend du système de base de données que vous utilisez.
Si vous utilisez SQLite, vous pouvez réinitialiser la clé primaire avec la suite de commandes shell:
Je ne sais pas exactement quand cela s'est ajoutée, mais la suite de gestion de la commande va supprimer toutes les données de toutes les tables et rétablir la fonction auto incrémenter les compteurs à 1.