Doppelten Primärschlüssel verhindern



  • Morgäähn,

    ich habe für unsere Schule eine Datenbank für die Bibo erstellt und dazu eine kleine Anwendung in Delphi geschrieben welches die wichtigsten Funktionen drauf hat wie Hinzufügen und löschen von Benutzern und Büchern.
    Jedes Buch und jeder Nutzer hat eine Nummer. Wenn ich jetzt einige Benutzer/Bücher lösche entstehen "Lücken", sprich die Bücher sind nicht korrekt durch nummeriert. Das ist noch nicht so schlimm, aber ich habe mein Prog so geschrieben das er die Nutzer/Bücher zählt und dann +1 die neue Nummer ist. Wenn da jetzt aber Lücken sind nimmt er Nummern die schon vorhanden sind.
    Zum Beipiel:
    Ich habe 100 Bücher
    die grösste Buchnummer beträgt, aber 00103. füge ich jetzt drei neue Bücher hinzu werden die Nummern 00101, 00102, 00103 doppelt belegt.
    Ich ahbe mir überlegt das wie folgt zu lösen:

    1. Jedes mal wenn ein Buch/Nutzer gelöscht wird werden die Nummern der darüberliegenden Bücher/Nutzer um eins verringert.

    2. Ich speichere in einer Datei die Lücken und fülle sie später wieder aus.

    ja das waren meine Ansätze,a ber vielleicht denke ich viel zu kompliziert weil es in SQL einen Befehl gibt der das regelt.
    Ich nutze im Übrigen SQL direct, delphi, Server: EasyPHP

    vielleicht habt ihr bessere Ideen, ansonsten würde ich Möglichkeit nummer 1 umsetzen.

    vielen dank im voraus

    mfg fabian



  • Die gängigen Datenbanken können das automatisch-eins-hinzuzählen wunderbar alleine (Stichwort autoincrement). Und selbst wenn Du das ganze selber machen willst (warum?), wo ist das Problem, wenn Lücken in der Numerierung sind? Nimm einfach max+1.



  • wo ist das Problem, wenn Lücken in der Numerierung sind? Nimm einfach max+1.

    Gefällt mir nicht dann habe ich in zwei Jahren ja nur noch Nummern vonn 1000 bis 2000 oder so

    ich werde aber mal nach dem autoincrement suchen, danke für den Tipp!!! 👍



  • mit dem autoincrement wirst du das selbe problem haben.
    die datenbank zaehlt die wert sturr um eins hoch.
    beim loeschen entstehen so auch luecken.

    im ueberigen sagt niemand, dass der primary key ein int sein
    muss.
    eine schoene moeglichkeit sind GUIDs (Globally Unique Identifier).
    schau mal ob dein db system sowas unterstuetzt.



  • Ja, und? Sind doch nur Schlüssel, ist ja nicht so, dass die Nummer 'ne Semantik hätte.



  • WO is da denn ein problem, das irgendwann nur noch IDs von 1000 bis 2000 vergeben sind?
    So hast du quasi gleich eine Art Kontrolle, wieviele Einträge du hattest...


Log in to reply