Willkommen bei Entwickler-Forum.
Seite 1 von 4 1 2 3 ... LetzteLetzte
Ergebnis 1 bis 10 von 36
  1. #1
    Zaungast
    Registriert seit
    13.11.2016
    Beiträge
    25

    Standard Wie Datensätze fortlaufend durchnummerieren ?

    Hallo allerseits,
    1)
    in einer Tabelle einer Datenbank will ich Zahlenpaare ablegen, wobei die 1. Zahl eines Zahlenpaars die Nummer des Zahlenpaars darstellen muß und alle 2. Zahlen jeweils verschieden sein müssen.
    Die Nummerierung beginnt bei 1 und zählt dann fortlaufend um 1 hoch.
    Ein Datensatz besteht also aus 2 Spalten.
    Datensätze konnten also z.B. so aussehen:
    1, 1
    2, 4
    3, 9
    4, 16
    5, 25
    6, 3
    7, 19
    ....

    Die Zahl 16 darf nicht eingefügt werden (als 8,16) da die 16 schon mal vorkommt, nämlich im Datensatz (4, 16)

    2)
    Meine Idee war, die 1. Spalte als Primärschlüssel zu definieren und die 2. Spalte also UNIQUE zu definieren.
    Solange ich dann Zahlenwerte einfügen will, die (auf die 2. Spalte) bezogen alle verschieden sind, funktioniert das einwandfrei.
    Wenn ich allerdings z.B. die Zahl 16 (als 2. Spaltenwert) einfügen will, wird dieser DB-Zugriff korrekterweise verweigert, aber der Primärschlüssel wird trotzdem hochgezählt und ich habe keine fortlaufende Nummerierung mehr.
    Beispiel:
    // In die leere Tabelle wird die Zahl 4 eingefügt, als Zahlenpaar:
    (1,4)
    Wenn ich jetzt nochmals die 4 einfügen will, wird dies verweigert.
    Wenn ich jetzt z.b. 17 einfügen will, wird in die DB folgender Datensatz eingefügt:
    (3,17)
    und mir geht die fortlaufende Nummerierung flöten.

    3)
    Wie kann ich das Problem lösen ?

    4)
    Gilt dies auch für eine MS-ACCESS Datenbank ?

    mfg
    Bh

  2. #2
    Forenheld
    Registriert seit
    26.02.2003
    Beiträge
    16.174

    Standard

    Wozu willst du eine Nummerierung?
    Wo ist das ein Problem?
    Es kann dir doch egal sein, ob Lücken im PrimaryKey sind.
    Eine Datenbank hat per se keine Sortierung. Eine Datenbank arbeitet mit Mengen. Nur weil du dir die Daten so anzeigen lässt, siehst du eine Reihenfolge. Würdest du sie nach der 2. Spalte sortieren, wo ist da die Reihenfolge? Oder würdest du nur bestimmte Datensätze selektieren, liegt auch keine Reihenfolge mehr vor. Der oder die PK dienen zu eindeutigen Identifikation der Datensätze. Mehr nicht.
    Sofern du eine bestimmte Sortierung der Datensätze brauchst, füge eine Spalte "sort" hinzu, mit der du die Reihenfolge bestimmst. D.h. du fügst selbst den nächsten Wert ein

    Üblicherweise prüft man die Daten vor dem speichern in die DB. D.h. man lässt sich nicht in eine DB-Exception fallen. Man fragt also vorher ab, ob es schon einen Datensatz mit der neuen Nummer in der Spalte 2 gibt. Wenn ja, erfolgt keine Speicherung in die DB, sondern man gibt bsp. eine Fehlermeldung aus oder schreibt das in ein Logfile
    Geändert von Christian Marquardt (19.11.2016 um 11:34 Uhr)
    Christian

  3. #3
    Stammgast
    Registriert seit
    18.07.2008
    Beiträge
    3.036

    Standard

    Wenn Du nur ein Programm/einen Thread hast was auf die Datenbank zugreift ist ein fortlaufender Schlüssel relativ einfach zu implementieren. Nimm eine Tabelle mit genau einer Zeile und schreib dort die zuletzt benutzte Zahl rein, aber nur wenn Du diese Zahl benutzt hast, ansonsten nicht. Falls mehrere Programme oder Threads darauf zugreifen wünsche ich Dir viel Spaß das ist wahrscheinlich eins der komplexesten Probleme in der IT überhaupt bzw. ist es bei parallelen Zugriffen von der Natur des Problems schon unmöglich eine wirklich fortlaufende Nummer zu generieren. Wenn drei Programme parallel eine neue Zahl wollen, welche bekommen sie dann?

  4. #4
    Zaungast
    Registriert seit
    13.11.2016
    Beiträge
    25

    Standard

    Zitat Zitat von fanderlf Beitrag anzeigen
    Wenn Du nur ein Programm/einen Thread hast was auf die Datenbank zugreift ist ein fortlaufender Schlüssel relativ einfach zu implementieren. Nimm eine Tabelle mit genau einer Zeile und schreib dort die zuletzt benutzte Zahl rein, aber nur wenn Du diese Zahl benutzt hast, ansonsten nicht. Falls mehrere Programme oder Threads darauf zugreifen wünsche ich Dir viel Spaß das ist wahrscheinlich eins der komplexesten Probleme in der IT überhaupt bzw. ist es bei parallelen Zugriffen von der Natur des Problems schon unmöglich eine wirklich fortlaufende Nummer zu generieren. Wenn drei Programme parallel eine neue Zahl wollen, welche bekommen sie dann?
    Hallo fanderif,
    1) Ich benutze genau 1 Programm, das auf diese DB zugreift.
    2) Leider habe ich deine Idee nicht verstanden:
    "Nimm eine Tabelle mit genau einer Zeile und schreib dort die zuletzt benutzte Zahl rein,
    aber nur wenn Du diese Zahl benutzt hast, ansonsten nicht."
    Aus welchen Spalten soll die Tabelle bestehen?
    Warum nur eine Zeile?
    Wenn man mehrere Datensätz einfügt, gibt es doch mehrere Zeile!
    Was meinst du genau?

    mfg
    Bh

  5. #5
    Zaungast
    Registriert seit
    13.11.2016
    Beiträge
    25

    Standard

    Hallo Christian,
    >
    >Wozu willst du eine Nummerierung?
    >Wo ist das ein Problem?
    >Es kann dir doch egal sein, ob Lücken im PrimaryKey sind.
    >
    Ich will ein mathematisches Problem lösen und dazu eine DB "zweckentfremden".

    >
    >Üblicherweise prüft man die Daten vor dem speichern in die DB. D.h.
    >man lässt sich nicht in eine DB-Exception fallen.
    >Man fragt also vorher ab, ob es schon einen Datensatz mit der neuen Nummer
    >in der Spalte 2 gibt. Wenn ja, erfolgt keine Speicherung in die DB,
    >sondern man gibt bsp. eine Fehlermeldung aus oder schreibt das in ein
    >
    geht das auch einfacher ?

    mfg
    Bh

  6. #6
    Forenheld
    Registriert seit
    26.02.2003
    Beiträge
    16.174

    Standard

    Ich will ein mathematisches Problem lösen und dazu eine DB "zweckentfremden".
    Sicherlich nicht mit dem automatisch erzeugten PK

    geht das auch einfacher ?
    Was sollte da einfacher gehen?
    Üblicherweise hat man wohl ein Frontend für die DB. Warum da keine Fehlerprüfung?
    Christian

  7. #7
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.803

    Standard

    Ich will ein mathematisches Problem lösen und dazu eine DB "zweckentfremden"
    Klingt leider so als wolltest du mit einer Motorsäge einen Nagel in die Wand hauen. Wenn du das willst ok. Aber bitte nachher nicht über praktisch ungeeignete Motorsägen meckern

    Um wie viele Zahlenpaare geht es denn hier? Nicht mehr als maximal ein paar Zehntausend? Dann denkt dir eine simple binäre Struktur deiner Zahlenpaare aus und schreib die komplett als Blob in die DB (Eine Zelle einer Tabelle).
    Lade dann immer komplett alle aus der DB und schreib die komplett wieder zurück. Es nützt nix nicht relationale Daten in eine relationale Struktur packen zu wollen.

    // In die leere Tabelle wird die Zahl 4 eingefügt, als Zahlenpaar:
    (1,4)
    Wenn ich jetzt nochmals die 4 einfügen will, wird dies verweigert.
    Wenn ich jetzt z.b. 17 einfügen will, wird in die DB folgender Datensatz eingefügt:
    (3,17)
    und mir geht die fortlaufende Nummerierung flöten.
    Wenn du nie löscht dann definiere den PK nicht als Generator/AutoInc Wert sondern einfach als simplen Integer. Ermittle dann selbst den nächsten Schlüsselwert (count(*)+1)

    > Üblicherweise prüft man die Daten vor dem speichern in die DB. D.h.
    Um das klar zu sagen. Das gilt allgemein maximal in einer Singleuser Umgebung. In diesem merkwürdigen Problem hier ist das möglicherweise auch ok. Aber sich nicht üblicherweise.

  8. #8
    Forenheld
    Registriert seit
    26.02.2003
    Beiträge
    16.174

    Standard

    Um das klar zu sagen. Das gilt allgemein maximal in einer Singleuser Umgebung.
    Seltsam, wir machen das auch in Client/Serveranwendungen.
    Warum sollte ich falsche Daten in die DB schreiben wollen?
    Also prüfe ich vorher, ob bsp. eine Telefonnumer nur Ziffern, eine IP nur Ziffern und Punkt enthält
    Christian

  9. #9
    Forenheld
    Registriert seit
    26.02.2003
    Beiträge
    16.174

    Standard

    Um das klar zu sagen. Das gilt allgemein maximal in einer Singleuser Umgebung.
    Seltsam, wir machen das auch in Client/Seranwendungen.
    Warum sollte ich falsche Daten in die DB schreiben wollen?
    Also prüfe ich vorher, ob bsp. eine Telefonnumer nur Ziffern, eine IP nur Ziffern und Punkt enthält.
    Falsche Daten werden schon durch die Anwendung abgewiesen und der Nutzer muss ggf. korrigieren
    Christian

  10. #10
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.803

    Standard

    Warum sollte ich falsche Daten in die DB schreiben wollen?[/COLOR]
    Zwischen prüfen und schreiben in die Datenbank kann sich der Zustand der Datenbank geändert haben, das Ergebnis der Prüfung sollte also völlig egal sein du musst den Zustand des System beim schreiben sicherstellen. Die Alternative wäre mit dem prüfen entsprechende Sperren auf die zu ändernden Daten zu legen. Das will man nur in ganz bestimmten Anwendungsfällen die sicherlich nicht unter der Bezeichnung üblich firmieren.

    Also prüfe ich vorher, ob bsp. eine Telefonnummer nur Ziffern, eine IP nur Ziffern und Punkt enthält.
    Du prüfst vielleicht das Format aber du würdest nicht prüfen ob die Telefonnummern schon da ist und dich dann nach der Prüfung darauf verlassen das beim tatsächlichen Schreiben in die DB die Telefonnummer auch tatsächlich nicht in der Datenbank ist. Diese Garantie würde teure Datenlocks nötig machen und/oder eine zweite Prüfung beim schreiben (Constraint, Indizes etc.) die die erste Prüfung weitestgehend unnötig machen.

 

 
Seite 1 von 4 1 2 3 ... LetzteLetzte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •