09.10.2014, 13:35
Liebe Kollegen,
an einigen Schulen ist der Umzug der Daten von Access auf die PostGreSQL-Datenbank offensichtlich nicht sauber verlaufen. Dadurch kommt es beim Erstellen von neuen Datensätzen (z. B. bei Ordnungsmaßnahmen, Leistungsnachweisen, Transportmedium, ...) zu dem Fehler.
Erklärung:
Alle Tabellen der NM-Datenbank haben einen Primärschlüssel mit einer laufenden Nummer. Die Nummer für den nächsten Datensatz wird dabei durch eine sogenannte "Sequenz" erzeugt, die beim abliefern einer solchen Nummer automatisch eins hochgezählt wird. Somit ist der aktuelle Wert einer solchern Sequenz immer 1 größer als der größte Primärschlüssel.
Normalerweise zumindest. Offensichtlich ist die Sequenz bei der Übernahme der Daten aus der Accessdatenbank nicht sauber hochgezählt worden (warum auch immer, muss ich noch mal schauen - geht ja eigentlich automatisch). Dadurch ist jetzt der aktuelle Wert der Sequenz kleiner als größte Primärschlüssel. Wird jetzt ein neuer Datensatz erstellt liefert die Sequenz einen Wert ab, der schon existiert und es wird ein Fehler erzeugt.
Lösung:
Das Problem kann manuell gelöst werden. Ich erkläre es am Beispiel der Tabelle "lnw" für Leistungsnachweise, es funktioniert aber mit allen anderen Tabellen gleich.
Gruß
Stephan
an einigen Schulen ist der Umzug der Daten von Access auf die PostGreSQL-Datenbank offensichtlich nicht sauber verlaufen. Dadurch kommt es beim Erstellen von neuen Datensätzen (z. B. bei Ordnungsmaßnahmen, Leistungsnachweisen, Transportmedium, ...) zu dem Fehler
Code:
FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint »...«
Erklärung:
Alle Tabellen der NM-Datenbank haben einen Primärschlüssel mit einer laufenden Nummer. Die Nummer für den nächsten Datensatz wird dabei durch eine sogenannte "Sequenz" erzeugt, die beim abliefern einer solchen Nummer automatisch eins hochgezählt wird. Somit ist der aktuelle Wert einer solchern Sequenz immer 1 größer als der größte Primärschlüssel.
Normalerweise zumindest. Offensichtlich ist die Sequenz bei der Übernahme der Daten aus der Accessdatenbank nicht sauber hochgezählt worden (warum auch immer, muss ich noch mal schauen - geht ja eigentlich automatisch). Dadurch ist jetzt der aktuelle Wert der Sequenz kleiner als größte Primärschlüssel. Wird jetzt ein neuer Datensatz erstellt liefert die Sequenz einen Wert ab, der schon existiert und es wird ein Fehler erzeugt.
Lösung:
Das Problem kann manuell gelöst werden. Ich erkläre es am Beispiel der Tabelle "lnw" für Leistungsnachweise, es funktioniert aber mit allen anderen Tabellen gleich.
- Datensicherung der NM-Datenbank erstellen
- PGAdmin starten, mit dem Server verbinden und die NM-Datenbank auswählen.
- über "Schemata > public > Tabellen > lnw" zur Tabelle durchklicken, dann über das Tabellensymbol in der Symbolleiste (rechts neben der Lupe) die Daten anzeigen.
- Die Spalte "lfdnr" ist mit [PK] markiert, das ist der Primärschlüssel. Normalerweise ist die Tabelle nach dieser Spalte sortiert, ganz unten steht also der größte Wert, z. B. 132.
- Jetzt zur zugehörigen Sequenz unter "Schemata > public > Sequenzen" wechseln. Die Sequenzen folgen dem Schema Tabellenname_Spaltenname_seq. Wir brauchen also lnw_lfdnr_seq.
- Über einen rechten Mausklick lassen sich die Eigenschaften der Sequenz anzeigen.
- Auf der zweiten Seite "Definition" steht der "Aktuelle Wert". Der dürfte also kleiner sein als der eben abgelesene Wert. Gemäß des obigen Beispiels nur 95.
- Dieser Wert kann jetzt einfach abgeändert werden. Mindestens auf den größten Wert aus der Tabelle plus 1 (im Beispiel also 133), man kann aber auch deutlich mehr angeben, z. B. 140 oder 150. Letzteres macht Sinn, wenn man die Änderungen im laufenden Betrieb vornimmt und möglicherweise gerade jemand neue Leistungsnachweise anlegt.
- Abschließend noch ein Klick auf OK und das Problem ist behoben.
Gruß
Stephan
RSS-Feed mit aktuellen Informationen über Updates, Änderungen in der Programmbedienung und anderen wichtigen Mitteilungen unter http://www.notenmanager.net/feeds/Notenmanager.xml