Maede: ID logisch fortsetzen

Hallo zusammen!

Ich habe folgendes Problem; In meiner MySQL-DB sind folgende ID's eingetragen; ID-1, ID-2, ID-3.

Wenn ich jetzt z.B. den Eintrag mit der ID-3 lösche, dann wird der nächste Eintrag in der MySQL-DB automatisch die ID-4 erhalten, obwohl die ID-3 gelöscht wurde und theoretisch wieder zur Verfügung steht.

Gibt es eine Möglichkeit dafür zu sorgen, dass die neue ID an der letzten ID in der DB ansetzt, also in dem oben genannten Beispiel z.B. wieder die ID-3 erhält.

Danke für die kommenden Antworten.

mfg: Maede

  1. Servus,

    Gibt es eine Möglichkeit dafür zu sorgen, dass die neue ID an der letzten ID in der DB ansetzt, also in dem oben genannten Beispiel z.B. wieder die ID-3 erhält.

    Ich wüsste nur die Möglichkeit die ID selber reinzuschraiben, als auto-increment wirst du da wenig erfolg haben.

    Wie trägst du die Daten eigentlich ein, per Formular oder wie setzt du dies um?

    1. Servus,

      Gibt es eine Möglichkeit dafür zu sorgen, dass die neue ID an der letzten ID in der DB ansetzt, also in dem oben genannten Beispiel z.B. wieder die ID-3 erhält.

      Ich wüsste nur die Möglichkeit die ID selber reinzuschraiben, als auto-increment wirst du da wenig erfolg haben.

      Wie trägst du die Daten eigentlich ein, per Formular oder wie setzt du dies um?

      Ich erstelle gerade ein Newsscript und damit ich die Kommentare mit dem entsprechenden Newseintrag verbinden kann, besitzt der Kommentar neben der eigenen ID noch die des Newseintrags.

      Wird ein Newseintrag per Formular erstellt, so wird die Möglichkeit geboten, Kommentare zu erlauben oder nicht. Werden Kommentare erlaubt, erscheint auf der Veröffentlichungsseite die News und ein Link, welcher auf die Kommentare der news verweisst.

      Damit man die richtigen Kommentare zur entsprechenden News erhält, wird ein mysql_query nach Kommentaren mit der news_ID gestartet. Ein Kommentar erhält neben der eigenen ID zusätzlich die ID des Newseintrags, diese ID wird in news_ID gespeichert.

      Damit dies funktioniert, muss diese ID bei der Erstellung der News mitgeliefert werden. Da diese allerdings zu diesem Zeitpunkt noch nicht existiert, habe ich eine mathematische Lösung eingesetzt und zwar ermittle ich immer den letzt Eintrag in der DB und dessen ID und addieren eine 1.

      Dadurch habe ich die neue ID, ohne dass der Datensatz erstellt wurde. Somit kann ich dann auch einen gültigen Link mit der neu erstellten News mitliefern, der auch gültig ist bzw. die enstprechende ID enthält.

      Tritt jedoch das oben genannte Szenario ein ermittelt er wieder eine 3, obwohl der Datensatz faktisch die ID-4 zugewiesen bekommt.

      Ich hoffe es ist verstädlich^^

      1. Hallo,

        Damit dies funktioniert, muss diese ID bei der Erstellung der News mitgeliefert werden. Da diese allerdings zu diesem Zeitpunkt noch nicht existiert, habe ich eine mathematische Lösung eingesetzt und zwar ermittle ich immer den letzt Eintrag in der DB und dessen ID und addieren eine 1.

        Dadurch habe ich die neue ID, ohne dass der Datensatz erstellt wurde. Somit kann ich dann auch einen gültigen Link mit der neu erstellten News mitliefern, der auch gültig ist bzw. die enstprechende ID enthält.

        Du baust somit eine Race Condition. Das ist eine schlechte Idee. Sie ist überflüssig.

        Wann ist es erforderlich, die ID der News zu kennen? Wenn die News veröffentlicht wird, nicht eher. Vorher kann man keine Kommentare veröffentlichen. Bei Einhaltung des EVA-Prinzips stehen Dir bei Erstellung der Ausgabe alle Informationen zur Verfügung, die Du benötigst, auch die mit AUTO_INCREMENT erhaltene ID. Bau daher nicht eine fehleranfällige Lösung, die gar nicht notwendig ist.

        Freundliche Grüße

        Vinzenz

        1. Ich habe es jetzt doch ganz simpel lösen können, ich habe lediglich nach dem mysql_query zur Erstellung des Datensatzes einen zweiten mysql_query gestartet, um die ID des letzten Eintrages (also des neuen) zu ermitteln und in eine Variable zu packen, damit ich diese in einem 3. mysql_query als Update in Kombination mit der Kommentare-url mitliefern kann.

          Danke für die vielen kompetenten Antworten.

          mfg: Maede

          1. Ich habe es jetzt doch ganz simpel lösen können, ich habe lediglich nach dem mysql_query zur Erstellung des Datensatzes einen zweiten mysql_query gestartet, um die ID des letzten Eintrages (also des neuen) zu ermitteln und in eine Variable zu packen, damit ich diese in einem 3. mysql_query als Update in Kombination mit der Kommentare-url mitliefern kann.

            Danke für die vielen kompetenten Antworten.

            Das ist defekt - du kannst nicht wissen, wie die queries abgearbeitet werden - ggf. wird zwischenzeitlich von einem anderen PHP-Prozess eine Abfrage abgesetzt und du erhälst die falsche Datensatz-ID. Das passiert z.B. wenn mehrer benutzer zeitgleich News erstellen.

            Das ist zwar Unwahrscheinlich aber dennoch vermeidbar.

            1. Ich habe es jetzt doch ganz simpel lösen können, ich habe lediglich nach dem mysql_query zur Erstellung des Datensatzes einen zweiten mysql_query gestartet, um die ID des letzten Eintrages (also des neuen) zu ermitteln und in eine Variable zu packen, damit ich diese in einem 3. mysql_query als Update in Kombination mit der Kommentare-url mitliefern kann.

              Danke für die vielen kompetenten Antworten.

              Das ist defekt - du kannst nicht wissen, wie die queries abgearbeitet werden - ggf. wird zwischenzeitlich von einem anderen PHP-Prozess eine Abfrage abgesetzt und du erhälst die falsche Datensatz-ID. Das passiert z.B. wenn mehrer benutzer zeitgleich News erstellen.

              Das ist zwar Unwahrscheinlich aber dennoch vermeidbar.

              Da hat er recht, spare dir den Zweiten Query und nimm mysql_insert_id(), damit wird genau die ID des letzten, von dieser Verbindung, eingefügte ID abgefragt. 100% Zuverlässig und schneller.

              btw. warum speicherst du die ID im Datensatz nocheinmal? Bau dein Link doch in der News selbst zusammen, dann sparste dir auch den 3ten Query.

              1. Nochmals danke an alle für die Antworten, ich konnte jetzt meine Lösung mit der Funktion mysql_insert_id() optimieren und fertigstellen.

                mfg: Maede

                1. Nochmals danke an alle für die Antworten, ich konnte jetzt meine Lösung mit der Funktion mysql_insert_id() optimieren und fertigstellen.

                  Nein, dein defekter Ansatz besteht weiterhin - wenn ein Kommentar zu einem gelöschten Datensatz existiert und unter dieser ID eine neue News angelegt wird, hast du einen falsch zugeordenten Kommentar.

                  IDs neu vergeben ist immer eine unkluge Idee - und wie bereits von mehreren erwähnt - nicht notwendig.

                  1. Nochmals danke an alle für die Antworten, ich konnte jetzt meine Lösung mit der Funktion mysql_insert_id() optimieren und fertigstellen.

                    Nein, dein defekter Ansatz besteht weiterhin - wenn ein Kommentar zu einem gelöschten Datensatz existiert und unter dieser ID eine neue News angelegt wird, hast du einen falsch zugeordenten Kommentar.

                    IDs neu vergeben ist immer eine unkluge Idee - und wie bereits von mehreren erwähnt - nicht notwendig.

                    Das macht er doch garnicht mehr, so wie ich das Verstehe, schreibt er die News in die DB, holt sich die News ID und schreibt wohl (warum auch immer) den Link in die DB.

                    Der Fehler von ID = alte-ID + 1 ist nicht mehr drin.

                    1. Das macht er doch garnicht mehr, so wie ich das Verstehe, schreibt er die News in die DB, holt sich die News ID und schreibt wohl (warum auch immer) den Link in die DB.

                      Recht hast du - Denkfehler meinerseits.

                      1. Recht hast du - Denkfehler meinerseits.

                        passiert :)

      2. Ich erstelle gerade ein Newsscript und damit ich die Kommentare mit dem entsprechenden Newseintrag verbinden kann, besitzt der Kommentar neben der eigenen ID noch die des Newseintrags.

        Dann solltest du auf jeden Fall auf Doppelvergabe einer ID verzichten, sonst werden Alte Kommentare zu gelöschen News nachher noch den neuen News zugeordnet.

        Damit dies funktioniert, muss diese ID bei der Erstellung der News mitgeliefert werden. Da diese allerdings zu diesem Zeitpunkt noch nicht existiert, habe ich eine mathematische Lösung eingesetzt und zwar ermittle ich immer den letzt Eintrag in der DB und dessen ID und addieren eine 1.

        Schreib dir doch einfach ne Zelle in MySQL oder in eine Text-Datei, die du bei jedem Eintrag eins raufsetzt. Ist auch ein mathematisches Verfahren und ähnelt der ID-Vergabe von MySQL ;-)

        Gruß

        1. Schreib dir doch einfach ne Zelle in MySQL oder in eine Text-Datei, die du bei jedem Eintrag eins raufsetzt. Ist auch ein mathematisches Verfahren und ähnelt der ID-Vergabe von MySQL ;-)

          Das ist nicht notwendig - wenn ein Kommentar erstellt wird, kann die ID des entsprechenden Newsbeitrags ermittelt werden - irgend ein zähler oder vergleichbares ist absoluter Unsinn.

      3. Hi Maede!

        Ich erstelle gerade ein Newsscript und damit ich die Kommentare mit dem entsprechenden Newseintrag verbinden kann, besitzt der Kommentar neben der eigenen ID noch die des Newseintrags.

        Logisch, er muss ja mit dem Newseintrag auch in Verbindung gebracht werden.
        Das hast du doch sicher als 1:n-Beziehung gelöst?

        Wird ein Newseintrag per Formular erstellt, so wird die Möglichkeit geboten, Kommentare zu erlauben oder nicht. Werden Kommentare erlaubt, erscheint auf der Veröffentlichungsseite die News und ein Link, welcher auf die Kommentare der news verweisst.

        Hier geht es also nur um die Erstellung der News.

        Damit man die richtigen Kommentare zur entsprechenden News erhält, wird ein mysql_query nach Kommentaren mit der news_ID gestartet. Ein Kommentar erhält neben der eigenen ID zusätzlich die ID des Newseintrags, diese ID wird in news_ID gespeichert.

        Jetzt geht es aber um die Anzeige! Für die Anzeige eines Beitrags wird doch sicherlich die ID übergeben, anhand derer du alle Kommentare aus der DB fischen kannst.

        Damit dies funktioniert, muss diese ID bei der Erstellung der News mitgeliefert werden.

        Wozu?

        Da diese allerdings zu diesem Zeitpunkt noch nicht existiert, habe ich eine mathematische Lösung eingesetzt und zwar ermittle ich immer den letzt Eintrag in der DB und dessen ID und addieren eine 1.

        Wieso sollte sie noch nicht existieren? Wenn du keinen Newsbeitrag erstellt hast, hast du auch keine ID zu diesem Beitrag. =)
        Hast du einen erstellt, ist die ID aber automatisch vorhanden.

        Ich verstehe dein Problem nicht.

        MfG H☼psel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
  2. Gibt es eine Möglichkeit dafür zu sorgen, dass die neue ID an der letzten ID in der DB ansetzt, also in dem oben genannten Beispiel z.B. wieder die ID-3 erhält.

    Ja die möglichkeit gibt es - aber es führt das Prinzip einer ID (einer eindeutigen Identifikation) ad absurdum. Und mir ist nicht begreiflich, warum man sowas überhaupt machen muss.

    Wenn jemand stirbt, wird auch nicht seine Sozialversicherungsnummer gelöscht und ein neuer Mensch erhält sie :)

  3. Danke für die kommenden Antworten.

    Das Problem hatte ich vor Jahren auch mal.
    Ich habe es in PHP gelöst, indem ich einfach die DB Ausgabe analysiert habe und die nächst freie ID genommen habe, das war recht einfach...

    Weiß nicht auf welche Technik du setzt und was für Ausgaben du hast.

    1. Das Problem hatte ich vor Jahren auch mal.
      Ich habe es in PHP gelöst, indem ich einfach die DB Ausgabe analysiert habe und die nächst freie ID genommen habe, das war recht einfach...

      Gerade bei Dokumenten mit Responses ganz gefährlich.