Markus Weigel: Gelösche Ids für Wiederverwendung finden

Hallo,

ich suche einen weg um IDs in einer Datenbank zu finden die gelöscht worden sind um sie wiederzuverwenden. Also zb.:
ID|Text
-------
1 | a
2 | b
4 | d
5 | e

ich möchte nun wenn ich einen neuen Datensatz einfüge die ID 3 als ungenutzt erkennen und für den neuen Eintrag benutzen. Zur Zeit mache ich es so das ich immer die Tabelle durchgehe und 2 Zeilen vergleiche was aber recht aufwendig ist. Gibt es einen einfacheren weg?

Gruß

Markus Weigel

  1. Moin!

    ich suche einen weg um IDs in einer Datenbank zu finden die gelöscht worden sind um sie wiederzuverwenden.

    Man verwendet IDs nicht wieder. IDs dienen der Identifikation - und zwar der eindeutigen! Wenn früher einmal eine ID "3" existiert hat, dann ist damit festgelegt, dass einzig und allein der damals zusammen mit dieser ID gespeicherte Datensatz gemeint sein kann. Wird der Datensatz gelöscht, wird diese ID niemals wieder verwendet.

    Es könnte dir ja beispielsweise passieren, dass du zwei Tabellen hast. Die eine Tabelle geht kaputt und muß durch ein Backup ersetzt werden - leider ein sehr altes. Und in diesem alten Backup existiert der alte Datensatz "3" noch, zwischenzeitlich wurde er gelöscht und durch einen neuen Datensatz "3" ersetzt, der außerdem noch Einträge in der anderen Tabelle hat. Vermutlich wird das Problem dann niemand merken.

    Wenn aber die ID "3" nicht wiederbenutzt wird, kann es solche Probleme einfach nicht geben.

    Wenn du deine Datensätze durchnumerieren willst, dann tu das außerhalb der Datenbank mit einer Zählschleife bei der Ausgabe.

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. Ich möchte nur wissen ob man in MySql in einer Liste von Schlüssel den Nächsten freien finden kann ohne alle Schlüssel zu durchlaufen und zwei aufeinander Folge zu vergleichen.  Alles andere ist weiter Gedacht als ich brauche und hilft mir nicht weiter.

      Gruß

      Markus Weigel

      1. Hallo Markus,

        Ich möchte nur wissen ob man in MySql in einer Liste von Schlüssel den Nächsten freien finden kann ohne alle Schlüssel zu durchlaufen und zwei aufeinander Folge zu vergleichen.

        Du äußerst hier einen sehr ungewöhnlichen Wunsch, auch wenn er im Archiv dieses Forums öfter auftaucht. Dass er nicht besonders sinnvoll ist, wurde Dir bereits zweimal gesagt. Deswegen existiert meines Wissens _keine_ in MySQL eingebaute Funktionalität, die Deinen Wunsch direkt bedient. Mir ist auch kein RDBMS bekannt, dass Dir dieses liefert.

        Alles andere ist weiter Gedacht als ich brauche und hilft mir nicht weiter.

        Warum hilft es Dir nicht weiter?
        Warum willst Du unbedingt entsorgte IDs wiederverwenden?
        Warum ist dies Deiner Meinung nach sinnvoll?
        Was stört Dich an den Lücken?

        Wenn Du unbedingt etwas nicht Sinnvolles haben willst, bitte:
         - Warum entwickelst Du Dir nicht selbst Deine gewünschte Funktionalität?
         - Du benötigst für Deinen Wunsch eine weitere Tabelle.

        Du solltest besser von Deinem Wunsch Abschied nehmen und die Lücken in den Reihen der IDs einfach akzeptieren. IDs tragen nun einmal keine weitere Information als die Identifikation eines bestimmten Datensatzes.

        Freundliche Grüße

        Vinzenz

      2. Hallo,

        Ich möchte nur wissen ob man in MySql in einer Liste von Schlüssel den Nächsten freien finden kann ohne alle Schlüssel zu durchlaufen und zwei aufeinander Folge zu vergleichen.  Alles andere ist weiter Gedacht als ich brauche und hilft mir nicht weiter.

        Ich denke, Du brauchst gar nicht patzig zu werden, wenn Dir jemand zu erklären versucht, dass Du den, sagen wir'S mal diplomatisch, ungünstigen Weg einschlägst.
        Üblicherweise werden ID's nicht wiederverwendet, da zu viele Gefahren damit verbunden sind. Das ist einfach so, und nicht einmal erst seit es Computer und elektronische Datenbanken gibt. Auch früher, im Zeitalter der händischen Datenverarbeitung und Produktpflege war jeder schlecht beraten, wenn er z.B. Artikelnummern wiederverwendet hat.

        Anders verhält es sich bei ID's die eine wohldefinierte, kurze Lebenszeit haben, z.B. Session-ID's. Hier geht man meist den Weg, dass man mit einem definierten Bereich von gültigen ID'S arbeitet, die zwar laufend hochgezählt werden, aber beim Erreichen der Obergrenze wieder auf 1 zurückspringen. Dabei muss der gültige Wertebereich so groß gewählt werden, dass garantiert ist, dass es keine zwei Sessions geben kann, die dieselbe ID besitzen.

        Ich persönlich sehe keinen wirklich vernünftigen Grund, sich den Aufwand anzutun, in einem ID-System die freien Werte zu finden, um sie wiederverwenden zu können. Aber vielleihct kannst Du  uns ja einen nennen.

        Grüße
          Klaus

      3. hi,

        Alles andere ist weiter Gedacht als ich brauche und hilft mir nicht weiter.

        Derzeit denkst du selbst weniger weit, als angebracht wäre.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. hi,

    ich suche einen weg um IDs in einer Datenbank zu finden die gelöscht worden sind um sie wiederzuverwenden.

    Sofern du nicht mehr da wärst - sollten deine Eltern ihren nächsten Sohn dann auch Markus Weigel nennen ...?

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. hi,

      ich suche einen weg um IDs in einer Datenbank zu finden die gelöscht worden sind um sie wiederzuverwenden.

      Sofern du nicht mehr da wärst - sollten deine Eltern ihren nächsten Sohn dann auch Markus Weigel nennen ...?

      gruß,
      wahsaga

      Mit ID ist ein eindeutiger Schlüssel gemeint der Temporär existierende Objetkte identifiziert. Sollte die Lebenszeit eines Objektes abgelaufen sein wird es gelöscht und somit auch der Datenbankeintrag. Ab diesen Zeitpunkt kann diese ID wiederverwand werden für neue Einträge. Was deine Antwort mit diesen Problem zu tun hat verstehe ich nicht. Das ganze ist in Mysql implemintiert.

      1. Hi,

        "Markus Weigel" ist doch auch eine eindeutige Identifizierung, nämlich für deine Person. Und du bist auch nur temporär. *grins* Deshalb die Frage, würden deine Eltern, nachdem deine jetzige Instanz zerstört ist, eine ganz andere Instanz wieder "Markus Weigel" nennen?

        Was für eine Rolle spielt es, ob ein zukünftiges Objekt die Id 3 oder 35477864 hat? Wie lange reicht ein Int32 (der typische Datentyp für Autoincrement)? du verbrauchst bei einer 32bit = 4byte Zahl denselben Speicher beim Wert 1 wie beim Wert 43556.

        Warum krampfhaft irgendwas implementieren wollen, was deine Sache nicht ein Haarbreit weiterbringt?

        Ciao, Frank

  3. echo $begrüßung;

    Über Sinn und Unsinn wurde ja schon diskutiert und im Allgemeinen schließe ich mich der Meinung an. Vielleicht findet sich ja eine brauchbare Lösung, wenn du die dieses Problem verursachende Aufgabenstellung einmal konkretisiert schilderst...

    ich suche einen weg um IDs in einer Datenbank zu finden die gelöscht worden sind um sie wiederzuverwenden.

    Wenn du sie nur als gelöscht markierst, statt sie ganz zu löschen, kannst du sie über dieses Kriterium finden.

    Ansonsten fällt mir keine Lösung ein, wie man etwas nicht vorhandenes aus einer Datenmenge mittels SQL findet.
    Man kann eine Datenmenge mit einer zweiten verknüpfen und dann suchen, was in der einen vorhanden ist und in der anderen nicht. Dazu muss aber erst mal die eine Datenmenge mit allen möglichen Werten vorhanden sein oder irgendwie automatisch erzeugt werden können. Mir ist kein Mechanismus dafür bekannt, außer den Möglichkeiten einer Stored Procedure, die erst ab MySQL 5.0 dabei sein soll. Dann aber könnte man gleich deine jetzige Lösung darin abbilden.

    echo "$verabschiedung $name";