Base - Autowert falsch

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

stegerpl

Base - Autowert falsch

Beitrag von stegerpl » Mi, 17.08.2016 09:31

Hallo,

Ich habe folgendes Problem: in einer Tabelle habe ich einen Primärschlüssel (Anzahl der Datensätze) als Autowert definiert und dieser zählt(e) auch wunderbar hoch. Aus nicht nachvollziehbaren Gründen (Fehlbedienung) sind jedoch Sprünge aufgetreten, sodass der Autowert nun nicht mehr der Anzahl der Datensätze entspricht. Offensichtlich gibt es dafür mehrere Auslöser: Löschen eines Datensatzes, manuelle Veränderung des Primärschlüssels (geht nach dem Speichern). Irgendwie nimmt Base in der Folge dann immer den größten Wert, der hier einmal eingetragen wurde.

Fragen:
-) wie kann ich den Autowert "zurücksetzen" damit er wieder bei der aktuell höchsten Nummer weiter zählt?
-) wie kann ich sicherstellen, dass dieses Verhalten nicht wieder auftritt? ggf. ein "Reset"-Makro

Danke!
Peter

RobertG
*******
Beiträge: 1734
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Base - Autowert falsch

Beitrag von RobertG » Mi, 17.08.2016 10:00

Hallo Peter,

das, was Du beschreibst, ist ein Missverständnis des Autowertes, dem sehr viele Anwender erliegen. Der Autowert ist nicht dazu gedacht, die Datensätze lückenlos durch zu nummerieren, sondern einfach nur jedem Datensatz ein einzigartiges Merkmal in Form einer Zahl zu verpassen. Unterschiedliche Datenbanken haben hier auch erst einmal unterschiedliche Startwerte implementiert. In der Standardeinstellung startet die internen HSQLDB den Autowert mit '0', MySQL z.B. startet mit '1'.
Was machst Du mit der Nummerierung, wenn ein Datensatz gelöscht wird? Dann fehlt zwischendurch eine Nummer und die Gesamtanzahl stimmt natürlich nicht mehr mit der Zahl des Autowertes überein. Vor allem beim Erstellen von Datenbanken geschieht es sehr häufig, dass Datensätze wieder gelöscht werden. Dann fehlen plötzlich sehr viele Werte zwischendurch. Und wieder hechelst Du dem hinterher, die Nummerierung mit der Anzahl in Übereinstimmung zu bekommen.
Was ist möglich?

Code: Alles auswählen

ALTER TABLE "Tabellenname" ALTER COLUMN "Feldname" RESTART WITH <neuer_Feldwert>
Du kannst den Startwert für die nächste Eingabe festlegen. Das bringt aber nur etwas, wenn Du Datensätze am Schluss einer Tabelle gelöscht hast. So etwas setze ich ein, wenn ich beim Aufbau einer Datenbank mit Dummydatensätzen gespielt habe und jetzt die Datenbank richtig nutzen will. Dann setze ich den neuen Feldwert auf '1' und meine Zählung beginnt mit '1'.
Das ganze geht auch über ein Makro gegebenenfalls für alle Tabellen automatisch. Siehe dazu im Handbuch im Kapitel "Makros" das Unterkapitel "Tabellenindex heruntersetzen ...".
Das alles beseitigt aber nicht das Problem, das Du hast, wenn Du zwischendurch Datensätze löscht.

Code: Alles auswählen

SELECT "ID", ( SELECT COUNT( "ID" ) FROM "Tabelle" WHERE "ID" <= "a"."ID" ) AS "lfdNr." FROM "Tabelle" AS "a"
Das Feld "ID" hat den Autowert. Durch die Abfrage wird im darauffolgenden Feld "lfdNr." eine durchgängig laufende Nummer von 1 an aufsteigend angezeigt. Du erhältst eine genaue Übersicht über die Anzahl der Datensätze. Details dazu sind ebenfalls im Handbuch zu finden: Kapitel "Datenbank-Aufgaben", Unterkapitel "Codeschnipsel" > "Zeilennummerierung".

Gruß

Robert

Gast

Re: Base - Autowert falsch

Beitrag von Gast » Mi, 17.08.2016 12:04

Hallo Robert,

vielen Dank für Deine prompte Antwort - JA das ist genau mein Problem/Missverständnis.

Das mit dem RESTART WITH werde ich mal ausprobieren. Wenn das die bestehenden Einträge NICHT löscht, wäre es auch genau die Lösung nach der ich gesucht habe => werde es als Makro hinter einer Schaltfläche verstecken, damit es auch für "Normal"-Benutzer zur Verfügung steht.

Hintergrund ist eine Inventardatenbank, welche wir gerade für unser Museum aufbauen. Da müssen wir derzeit alle Exponate (erstmals) erfassen. Welche Nummer welches Exponat bekommt ist dabei eigentlich egal, solange sie nur einmalig ist. Eine Sub-Organisation über die Nummernkreise habe ich von Haus aus abgelehnt (weil das in der Praxis nix wird). Somit können wir auch auftretende "Löcher" nachträglich befüllen.

Danke - Gruß
Peter

Antworten