2016-04-07 3 views
1

In Django 1.8.11, eine PostgreSQL Backend verwenden, wenn ich eine Tabelle mit 3 Artikel darin haben (id von 1, 2, 3) und I ein Element einzufügen manuell so wie, explizit die ID festgelegt wird:Warum wird der Tabellenwert nicht explizit durch den Wert eines AutoFields erhöht?

i = MyItem(id = 10, field1 = "foo") 
i.save() 

ich nehme zur Kenntnis, dass der nächste Wert der AutoField Sequenz der Tabelle nicht nicht aktualisiert:

>> select nextval('myapp_myitem_id_seq') 
4 

Ist das von Design? Ich sehe this question, die mir sagt, wie man die Sequenz zurücksetzt, aber warum sollte die Reihenfolge überhaupt nicht synchron sein? Sollte die Sequenz in diesem Beispiel nicht auf 11 eingestellt sein?

+0

Warum müssen Sie die ID manuell einstellen? – ahmed

+0

Ich verschiebe Daten von einer Tabelle in eine andere (lange Geschichte), und ich möchte, dass alle Spalten ihre genauen Werte behalten. Alles funktioniert gut, aber der interne Sequenzzähler wird nicht aktualisiert, daher fügt future bei einem Schlüsselkonflikt Wurffehler hinzu. Ich hätte angenommen, dass die Sequenz korrekt aktualisiert würde. –

+0

ok, dann sollte die ID eindeutig sein, wenn Sie aus einer Tabelle mit eindeutigen IDs kopieren, ich denke, Sie müssen den Conter manuell mit Pg Befehlszeile zurücksetzen. Auch die 'get_or_create()' könnte nützlich sein. – ahmed

Antwort

2

Es ist in der Tat von Entwurf. Eine Sequenz ist nur ein anderes Objekt in der Datenbank, das von der Tabelle getrennt ist. Es ist genau das, was es sagt - eine Möglichkeit für die Datenbank, eine arithmetische Zahlenfolge zu erzeugen. Es kann mit einer Tabelle verknüpft werden und wird sehr oft verwendet, um ID-Werte automatisch zu generieren, aber das ist nicht das einzige, für das es verwendet werden kann. (Beachten Sie, dass sich dies von der Art und Weise unterscheidet, wie einige andere Datenbanken AutoFields handhaben, wie zB das AUTO_INCREMENT-Flag von MySQL. AUTO_INCREMENT kann nur für das ID-Feld verwendet werden, während eine Sequenz allgemeiner ist. Ja, und andere Datenbanken ignorieren weiterhin alle Werte Geben Sie das ID-Feld an, es sei denn, Sie bitten die Datenbank explizit, den Wert nicht vorher zu ignorieren - Hallo, MS SQL, ich spreche von Ihnen.

Immer wenn Sie vorhandene Daten in Ihre Datenbank importieren müssen, einschließlich ID-Werte müssen Sie sicherstellen, dass die Sequenzen, die zu allen relevanten Tabellen gehören, später aktualisiert werden. Es gibt keine Magie, die dies automatisch bei jeder INSERT-Anweisung tun würde, zumindest nicht standardmäßig. (Ich denke, Sie etwas zu diesem Effekt erzielen könnten einen Auslöser, aber ich habe nie versucht, so etwas.)

By the way, die PostgreSQL Wiki enthält a very useful recipealle Sequenzen in einer Datenbank zu reparieren, was ich habe in der von Ihnen verknüpften Frage keine Referenz gefunden (zumindest nicht auf einen Blick).

Verwandte Themen