Dirk Skerz: Zahlen erhöhen...

Halli Hallo,

Ich habe in meiner Tabelle ein Feld(Nr.) ist ein int-Wert.

Ich erhöhe diese Zahl nach jedem update oder insert neuer Daten um +1...

Ich lese den letzten Wert aus und erhöhe diesen um 1...

auto-increment geht hier nicht...

was mache ich, wenn diese Eintrag gelöscht wird?

z.B.  1,2,3,4,5,6

Ich lösche den Eintrag mit der Zahl 4, nun liest meine Prog. die höhste Zahl aus und erhöht diese um 1.
Wie mache ich es, das ich auch nicht mehr benutzte Zahlen wieder verwenden kann? DANKE

  1. Hi,

    kommt drauf an: Ist die Konstanz einer Zahl über die Lebenszeit von Bedeutung? Wenn nein, dann lösche nicht nur die alte Zahl, sondern dekrementiere alle höheren um 1, so bleibt keine Lücke.
    Muss die einmal vergebene Zahl konstant bleiben, dann wird's hässlich. Dann bleibt dir aus meiner Sicht nichts anderes übrig als eine Lücke in den Zahlen von Hand zu suchen.

    MfG
    Rouven

    --
    -------------------
    Buy when there's blood running in the street and sell when everyone is pounding at your door, clawing to own your equities  --  Wisdom on Wallstreet
    1. wäre mysql_num_rows+1 nicht auch eine möglichkeit wenn Lücken bedeutunglos sind???

      1. Hi,

        wäre mysql_num_rows+1 nicht auch eine möglichkeit wenn Lücken bedeutunglos sind???

        1,2,4
        Was ergibt deine Abfrage als nächsten Wert? 3+1 = 4, also eine Zahl die schon vergeben ist.

        MfG
        Rouven

        --
        -------------------
        Unser Problem ist, dass wir eine Demokratie entwickelt haben, was nicht immer der richtige Weg ist  --  Bernie Ecclestone zu den lästigen Diskussionen um Regeländerungen in der Formel 1
    2. Die Zahl muss konstant bleiben, diese dient einer einmaligen Zuordnung,
      nur wenn die Beziehung gelöscht wird. Kann diese Zahl wieder freigegeben werden.

      Muss die einmal vergebene Zahl konstant bleiben, dann wird's hässlich. Dann bleibt dir aus meiner Sicht nichts anderes übrig als eine Lücke in den Zahlen von Hand zu suchen.

      MfG
      Rouven

      1. Hi,

        das ist "ärgerlich" - dann bleibt dir nur Skript- oder StoredProcedure-Logik um eine Lücke in den Daten zu suchen.
        Man könnte auch noch folgendes machen: Neben der Datentabelle führt man eine "gelöschte Zahlen"-Tabelle. Sucht man nun einen neuen Wert, schlägt man zunächst in der gelöschte-Zahlen-Tabelle nach ob man dort eine findet. Wenn ja, nimm die. Wenn nein, erzeuge über MAX+1 eine neue. Die Frage in beiden Fälle ist, ist die Vermeidung von Lücken wirklich so einen Aufwand wert?

        MfG
        Rouven

        --
        -------------------
        Death is nature's way of telling you to slow down.
        1. Gute Idee, ist mir auch schonmal in den Sinn gekommen...

          Was hälst du davon,

          ich erstelle eine Schleife, die von 1 fortlaufend jede Zahl prüft ob vorhanden ist, wenn nicht bzw. Lücke, nimm diese Zahl.

          wäre diese variante gut oder zu intensiv?

          Hi,

          das ist "ärgerlich" - dann bleibt dir nur Skript- oder StoredProcedure-Logik um eine Lücke in den Daten zu suchen.
          Man könnte auch noch folgendes machen: Neben der Datentabelle führt man eine "gelöschte Zahlen"-Tabelle. Sucht man nun einen neuen Wert, schlägt man zunächst in der gelöschte-Zahlen-Tabelle nach ob man dort eine findet. Wenn ja, nimm die. Wenn nein, erzeuge über MAX+1 eine neue. Die Frage in beiden Fälle ist, ist die Vermeidung von Lücken wirklich so einen Aufwand wert?

          MfG
          Rouven

          1. Hi,

            funktioniert, aber von all den Lösungen finde ich Siechfrieds Vorschlag bisher am effizientesten. Eine Lücke zu suchen ist je nach Datensatzzahl eine Verschwendung von unglaublichen Ressourcen. Bedenke, dass du bei 1 Mio Datensätzen 1 Million Abfragen brauchst um überhaupt festzustellen, dass da eine Lücke ist. Ja, man kann das Beschleunigen falls keine Lücke da sein (MAX(zahl) = COUNT(datensätze)), aber falls dem nicht so ist musst du die Lücke dann immer noch suchen gehen, im Schnitt dürften das dann 500.000 Suchabfragen sein.

            MfG
            Rouven

            --
            -------------------
            "I wish it need not have happened in my time" - "So do I, and so do all who live to see such times. But that is not for them to decide. All we have to decide is what to do with the time that is given us."  --  J.R.R. Tolkien: "The Lord Of The Rings: The Fellowship Of The Ring"
      2. Hallo Dirk,

        Muss die einmal vergebene Zahl konstant bleiben, dann wird's hässlich. Dann bleibt dir aus meiner Sicht nichts anderes übrig als eine Lücke in den Zahlen von Hand zu suchen.

        Die Zahl muss konstant bleiben, diese dient einer einmaligen Zuordnung, nur wenn die Beziehung gelöscht wird. Kann diese Zahl wieder freigegeben werden.

        Bist du dir sicher, dass du das wirklich willst? Folgendes Szenario:

        * Benutzer 25 will mit Benutzer Nummer 37 irgendwas machen (sagen wir mal ihm 'ne E-Mail schreiben
          oder so). Er fängt an zu tippen.
        * Benutzer 37 meldet sich ab.
        * Ein neuer Benutzer meldet sich an, er erhält die Nummer 37, die ja nun frei ist.
        * Benutzer 25 sendet die E-Mail ab (in dem Forumular war in nem hidden-field die ID gespeichert),
          der _neue_ Benutzer 24 kriegt die Mail.

        Das ist jetzt noch die harmlosere Variante (stell dir z.B. vor, du willst Benutzer 37 "löschen", weil er dauernd getrollt hat. Du vergisst es aber, denkst dann nach ein paar Stunden wieder dran...)

        Eine ID muss eindeutig sein. Für immer. Wenn es dir nur ums Aussehen geht, kannst du (z.B. du willst 'ne Liste mit allen Benutzern ausgeben) bei der Ausgabe fortlaufende Nummern machen (oder <ol>).
        Oder mach keine Nummern als ID, sondern z.B. "dirk.skerz", "marian.sigler" oder so.

        (Siehe auch dieses und dieses (v.a. 2. und 3.) Posting)

        Viele Grüße aus Freiburg,
        Marian

        --
        Microsoft broke Volkswagen's world record: Volkswagen made only 22 million bugs!
        <!--[if IE]><meta http-equiv="refresh" content="0; URL=http://www.getfirefox.com"><[endif]-->
  2. Hell-O!

    Ich lösche den Eintrag mit der Zahl 4, nun liest meine Prog. die höhste Zahl aus und erhöht diese um 1. Wie mache ich es, das ich auch nicht mehr benutzte Zahlen wieder verwenden kann?

    Lösche die Datensätze nicht physisch, sondern setze ein entsprechendes Flag "gelöscht". Dann hole dir vor einem INSERT alle Einträge, die als "gelöscht" markiert wurden und überschreibe den mit der kleinsten ID. Natürlich musst du deine SELECT-Abfragen dann noch dahingehend verändern, dass dir nur Datensätze ausgegeben werden, die nicht als gelöscht markiert wurden. Sinnvoll ist diese Vorgehensweise aber nur, wenn der ID keine historische Bedeutung zukommt.

    Siechfred

    --
    Ich bin strenggenommen auch nur interessierter Laie. (molily)
  3. Halli Hallo,

    Hallo.

    Ich habe in meiner Tabelle ein Feld(Nr.) ist ein int-Wert.

    Ich erhöhe diese Zahl nach jedem update oder insert neuer Daten um +1...

    Ich lese den letzten Wert aus und erhöhe diesen um 1...

    auto-increment geht hier nicht...

    Vielen Anfängern (ich weiß nicht ob du einer bist) missfällt, dass Einträge in Datenbanken nicht von "oben nach unten" durchnummeriert werden und dass Lücken entstehen, wenn Datensätze gelöscht werden. Dies ist aber richtig so und ist wichtig um einen Datensatz eindeutig zu identifiezieren. Marian hat dir schon erklärt warum.

    In einer Datenbank gibt es keine feste Reihenfolge der Datensätze. Willst du eine erzwingen nutze ORDER BY bei einer Abfrage. Diese Datensätze kannst du dann noch in deinem Skript durchnummerieren.

    Grüße
    Jasmin