Warum gehen SQL-ID-Sequenzen nicht synchron (speziell mit Postgres)?

8

Ich habe Lösungen zum Aktualisieren einer Sequenz gesehen, wenn sie nicht mit dem generierten Primärschlüssel synchronisiert sind, aber ich verstehe nicht, wie dieses Problem von vornherein auftritt.

Hat jemand einen Einblick darin, wie ein Primärschlüsselfeld, dessen Standardwert als nextval einer Sequenz definiert ist und dessen Primärschlüssel nirgendwo explizit festgelegt sind, nicht mit der Sequenz synchronisiert werden kann? Ich benutze Postgres und wir sehen, dass dies ab und zu geschieht. Es führt schließlich zu einer doppelten Schlüsseleinschränkung, wenn die Sequenz eine ID für eine vorhandene Zeile erzeugt.

    
Jake 16.02.2012, 15:49
quelle

2 Antworten

8

Ihre Anwendung legt wahrscheinlich gelegentlich den Wert für den Primärschlüssel für eine neue Zeile fest. Dann braucht postgresql keine neue Sequenz und die Sequenz wird nicht aktualisiert.

    
Joe Van Dyk 16.02.2012, 22:17
quelle
0

Wenn eine Sequenznummer zugewiesen wird, bleibt sie zugewiesen, selbst wenn der TX, der sie angefordert hat, zurückgesetzt wird. So kann eine Nummer vergeben werden, die nicht in der Stable-Datenbank erscheint. Natürlich können Zeilen auch gelöscht werden, nachdem sie erstellt wurden, so dass die maximale Anzahl, die in der Tabelle gefunden wird, nicht die maximale Anzahl sein muss, die jemals zugewiesen wurde. Dies gilt für jeden automatisch inkrementierenden Typ.

Je nach verwendeter Technologie können auch separate Sequenzen mit mehreren Tabellen verwendet werden, sodass ein Wert in Tabelle A möglicherweise fehlt, aber in Tabelle B vorhanden ist. Das könnte an einem Fehler bei der Verwendung von Sequenznamen liegen, oder es könnte beabsichtigt sein.

    
Jonathan Leffler 16.02.2012 22:26
quelle

Tags und Links