Ich benutze Django und bekomme ab und zu den folgenden Fehler:
IntegrityError: doppelter Schlüsselwert verletzt eindeutige Einschränkung "myapp_mymodel_pkey"
DETAIL: Schlüssel (id) = (1) ist bereits vorhanden.
Meine Postgres-Datenbank hat tatsächlich ein myapp_mymodel- Objekt mit dem Primärschlüssel 1.
Warum sollte Postgres versuchen, diesen Primärschlüssel erneut zu verwenden? Oder verursacht dies höchstwahrscheinlich meine Anwendung (oder Djangos ORM)?
Dieses Problem trat gerade noch dreimal hintereinander auf. Was ich gefunden habe ist , dass , wenn es nicht auftreten , es geschieht ein oder mehr Male in einer Reihe für eine bestimmte Tabelle, dann nicht wieder. Es scheint für jeden Tisch zu passieren, bevor er tagelang vollständig angehalten wird, und zwar für mindestens eine Minute oder so pro Tisch, wenn es auftritt, und nur zeitweise (nicht alle Tische sofort).
Die Tatsache, dass dieser Fehler so sporadisch auftritt (nur etwa drei Mal in zwei Wochen aufgetreten - keine andere Belastung der Datenbank, nur ich teste meine Anwendung), macht mich bei einem Problem auf niedriger Ebene so vorsichtig.
quelle
Antworten:
PostgreSQL versucht nicht, doppelte Werte selbst einzufügen, sondern Sie (Ihre Anwendung, einschließlich ORM).
Es kann sich entweder um eine Sequenz handeln, die dem PK die Werte zuführt, die an der falschen Position eingestellt sind, und die Tabelle, die bereits den gleichen Wert enthält
nextval()
- oder einfach darum, dass Ihre Anwendung das Falsche tut. Das erste Problem lässt sich leicht beheben:Das zweite bedeutet Debuggen.
Django (oder ein beliebtes anderes Framework) setzt Sequenzen nicht von alleine zurück - sonst hätten wir jeden zweiten Tag ähnliche Fragen.
quelle
max(id)
vor Abschluss der ersten Abfrage abgerufen wird, und dann beide ausgeführt werden das gleiche Ergebnis?Sie werden höchstwahrscheinlich eine Zeile in eine Tabelle einfügen, für die der Wert der seriellen Spaltensequenz nicht aktualisiert wird.
Betrachten Sie die folgende Spalte in Ihrer Tabelle, die der von Django ORM für Postgres definierte Primärschlüssel ist
Dessen Standardwert ist auf festgelegt
Die Reihenfolge wird nur ausgewertet, wenn das Feld id leer ist. Dies ist jedoch ein Problem, wenn bereits Einträge in der Tabelle vorhanden sind.
Die Frage ist, warum diese früheren Einträge keine Sequenzaktualisierung ausgelöst haben. Dies liegt daran, dass der ID-Wert für alle früheren Einträge explizit angegeben wurde.
In meinem Fall wurden diese anfänglichen Einträge von Fixtures durch Migrationen geladen.
Dieses Problem kann auch durch benutzerdefinierte Einträge mit zufälligen PK-Werten schwierig werden.
Sprich für zB. Ihre Tabelle enthält 10 Einträge. Sie machen eine explizite Eingabe mit PK = 15. Die nächsten vier Code-Einfügungen würden einwandfrei funktionieren, die fünfte würde jedoch eine Ausnahme auslösen.
quelle
Ich landete hier mit genau demselben Fehler, der selten auftrat und schwer zu verfolgen war, weil ich nicht dort nach ihm suchte, wo ich sollte.
Fehler war die JS-Wiederholung, bei der der POST zweimal auf dem Server ausgeführt wurde! Manchmal lohnt es sich also, nicht nur Ihre Django-Ansichten und -Formulare (oder andere Webframeworks) zu betrachten, sondern auch, was ganz vorne passiert.
quelle
Ja, komische Sache. In meinem Fall scheint etwas beim Laden von Daten bei Migrationen nicht zu stimmen. Ich fügte leere Migration hinzu und schrieb die Zeilen, um einige anfängliche Daten hinzuzufügen, 6 Aufzeichnungen in meinem Fall.
Dann habe ich im Admin-Bereich versucht, ein neues Element hinzuzufügen und Folgendes erhalten:
Erster Versuch:
Spätere Versuche:
Und schließlich sind die siebten und letzten Male alle erfolgreich
Ich sage also, dass es vielleicht etwas mit bulk_create zu tun hat, als ich dort 6 Artikel geladen habe. Vielleicht ist es etwas Ähnliches in Ihrem Django-Projekt, das das verursacht.
Django 1.9 PostgreSQL 9.3.14
quelle