Forum Notenmanager

Normale Version: FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint ...
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
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
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.
  1. Datensicherung der NM-Datenbank erstellen
  2. PGAdmin starten, mit dem Server verbinden und die NM-Datenbank auswählen.
  3. über "Schemata > public > Tabellen > lnw" zur Tabelle durchklicken, dann über das Tabellensymbol in der Symbolleiste (rechts neben der Lupe) die Daten anzeigen.
  4. 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.
  5. Jetzt zur zugehörigen Sequenz unter "Schemata > public > Sequenzen" wechseln. Die Sequenzen folgen dem Schema Tabellenname_Spaltenname_seq. Wir brauchen also lnw_lfdnr_seq.
  6. Über einen rechten Mausklick lassen sich die Eigenschaften der Sequenz anzeigen.
  7. 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.
  8. 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.
  9. Abschließend noch ein Klick auf OK und das Problem ist behoben.

Gruß
Stephan
Hallo Stephan,

bei mir werden in der Postgresql-Logdatei folgende Fehler angezeigt. Sind diese problematisch?

Oct 13 12:27:22 nm postgres[24949]: [2-1] FEHLER: Typmodifikator ist für Typ »text« nicht erlaubt bei Zeichen 44
Oct 13 12:27:22 nm postgres[24949]: [2-2] ANWEISUNG: ALTER TABLE Sys_Settings ADD HVBackupPath TEXT(250)
Oct 13 12:27:23 nm postgres[24949]: [3-1] FEHLER: Zeichenkette in Anführungszeichen nicht abgeschlossen bei »'Br);« bei Zeichen 211
Oct 13 12:27:23 nm postgres[24949]: [3-2] ANWEISUNG: UPDATE noten SET listpos = (SELECT faecher.lfdnr FROM faecher,unterricht WHERE unterricht.index = noten.uindex AND faecher.fachkuerzel = unterricht.fach AND unterricht.klasse <> 'WF' AND unterricht.lehrkraft = 'Br);
Oct 13 12:27:23 nm postgres[24949]: [4-1] FEHLER: Typmodifikator ist für Typ »text« nicht erlaubt bei Zeichen 44
Oct 13 12:27:23 nm postgres[24949]: [4-2] ANWEISUNG: ALTER TABLE Sys_Settings ADD HVBackupPath TEXT(250)


______________________________

Ebenso befinden sich in der Log-Datei etliche Meldungen der folgenden Form:

Oct 13 10:59:17 nm postgres[24466]: [21-1] FEHLER: ungültige Eingabesyntax für Typ timestamp: »10:59:20« bei Zeichen 113
Oct 13 10:59:17 nm postgres[24466]: [21-2] ANWEISUNG: BEGIN;INSERT INTO notenlog (nnr,datum,uhrzeit,spalte,notenwert,notendaten,nmuser,sync) VALUES (388,'13.10.2014','10:59:20',10,'4','13.10.2014###13.10.2014#10:57:32#1','Ki',False);
Hallo Peter,

nein, nichts davon ist problematisch. Zwei der Fehler beziehen sich auf eine noch nicht veröffentlichte Funktion, der zugehörige Code dürfte bei euch eigentlich gar nicht ausgeführt werden.
Der dritte Fehler ist ein SQL-Befehl, der eigentlich nur bei Verwendung einer Access-Datenbank ausgeführt werden sollte.

Ich habe beides bereinigt, mit den nächsten Updates (NMSync, NMAdmin, Schulversion heute) verschwinden die Fehlermeldungen.

Gruß
Stephan