Django-Modell Instanzen Primärschlüssel nicht auf 1 zurückgesetzt, wenn alle Instanzen gelöscht werden
Ich habe auf eine offline-version meiner Django-web-app und haben Häufig gelöscht-Modell-Instanzen für eine bestimmte ModelX.
Habe ich dies getan, von der admin-Seite und erlebt haben, keine Probleme. Das Modell hat nur zwei Felder: name und Ordnung, und keine anderen Beziehungen zu anderen Modellen.
Neuen Instanzen sind angesichts der nächstmöglichen pk, die Sinn macht, und wenn ich Sie gelöscht haben, alle Instanzen, hinzufügen einer neuen Instanz ergibt für pk=1, was ich erwarte.
Verschieben Sie den code online zu meinem eigentlichen Datenbank habe ich gemerkt, dass dies nicht der Fall ist. Ich brauchte zum ändern der Modell-Instanzen, so dass ich Sie alle gelöscht, aber zu meiner überraschung die Primärschlüssel gehalten auf der Inkrementierung ohne zurücksetzen wieder auf 1.
Geht in die Datenbank mit Hilfe des Django-API habe ich geprüft und die alten Instanzen gegangen sind, aber auch das hinzufügen neuer Instanzen Ertrag eines primären Schlüssels, der nimmt wo das Letzte gelöschte Instanz nach Links ab, statt 1.
Frage, ob jemand weiß, was könnte das Problem hier.
InformationsquelleAutor der Frage pj2452 | 2015-01-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie andere gesagt haben, das ist ganz in der Verantwortung der Datenbank.
Aber Sie sollten erkennen, dass dies der wünschenswert Verhalten. Eine ID eindeutig identifiziert eine Entität in der Datenbank. Als solche sollten die Informationen beziehen sich immer nur auf eine Zeile. Wenn diese Zeile wird anschließend gelöscht, es gibt keinen Grund, warum sollten Sie wollen eine neue Zeile zu re-verwenden, die ID: wenn Sie das Tat, Sie würde erstellen Sie eine Verwirrung zwischen dem jetzt gelöschten Entität, benutzt zu haben, die ID und die neu erstellte eine, die er wiederverwendet. Es gibt keinen Punkt, dies zu tun, und Sie sollten nicht so tun wollen.
InformationsquelleAutor der Antwort Daniel Roseman
Ich würde nicht nennen es ein Problem. Dies ist das Standardverhalten für viele Datenbank-Systeme. Im Grunde, die auto-increment-Zähler für eine Tabelle persistent ist, und löschen der Einträge hat keine Auswirkungen auf die Theke. Der tatsächliche Wert der primären Schlüssel nicht auf die Leistung auswirken oder irgendetwas, es hat nur einen ästhetischen Wert (wenn Sie jemals zu erreichen das 2-Milliarden-Grenze wirst du wahrscheinlich noch andere Probleme zu kümmern).
Wenn Sie wirklich wollen, um den Zähler zurückzusetzen, können Sie löschen und neu erstellen der Tabelle:
Oder, wenn Sie benötigen, um die Daten aus anderen Tabellen in der app können Sie manuell den Zähler zurücksetzen:
Der wahrscheinlichste Grund sehen Sie anderes Verhalten als in Ihrer offline-und online-apps, ist, dass die auto-Inkrement-Wert wird nur im Arbeitsspeicher gespeichert, nicht auf der Festplatte. Es wird neu berechnet, wie
MAX(<column>) + 1
jedes mal, wenn der Datenbank-server neu gestartet wird. Wenn die Tabelle leer ist, wird es komplett zurücksetzen auf einen Neustart. Dies ist wahrscheinlich sehr oft für Ihr offline-Umfeld und in der Nähe keine für Ihre online-Umgebung.InformationsquelleAutor der Antwort knbk
Hast du eigentlich ziehen Sie Sie aus Ihrer Datenbank oder haben Sie Sie löschen mit Django? Django wird sich nicht ändern
AUTO_INCREMENT
für Ihre Tabelle nur durch das löschen von Zeilen aus, also, wenn Sie zurücksetzen möchten Ihre primäre Tasten, die Sie haben könnten, gehen Sie in Ihren db-und:(Dies setzt Voraus, verwendest du MySQL oder ähnliches).
InformationsquelleAutor der Antwort xnx
Gibt es kein Problem, das ist so, wie Datenbanken funktionieren. Django hat nichts zu tun mit der Erzeugung von ids, es zeigt nur, dass die Datenbank eine Zeile einfügen und bekommt die id in der Antwort aus der Datenbank. Die id beginnt bei 1 für jede Tabelle und erhöht jedes mal, wenn Sie eine Zeile einfügen. Das löschen von Zeilen führt nicht dazu, dass die id zurück. Sie sollten in der Regel nicht besorgt sein, dass alles, was Sie wissen müssen ist, dass jede Zeile hat eine eindeutige id.
Sie können natürlich ändern, die Zähler, generiert die id für die Tabelle mit einem Befehl Datenbank und hängt von der jeweiligen Datenbank-system Sie verwenden.
InformationsquelleAutor der Antwort nima
Wenn Sie mit SQLite setzen Sie den Primärschlüssel mit der folgenden shell-Befehle:
InformationsquelleAutor der Antwort Juan Navarrete
Ich bin nicht sicher, Wann dieser Hinzugefügt wurde, aber die folgenden management-Befehl löscht alle Daten aus allen Tabellen und zurücksetzen, werden die auto increment-Zähler um 1.
InformationsquelleAutor der Antwort Dan Loewenherz