Philipp: Eigenes "auto_increment id" funktioniert nicht

Hallo,
 da es bei PHP/MySQL etwas ungünstig ist, dass nach dem Löschen von Einträgen Lücken bei den IDs entstehen, wollte ich das ganze selbst in die Hand nehmen.
Der Code sieht so aus:

---
mysql_query("SELECT MAX (id) + 1 as maxid FROM $db_table");

mysql_query("INSERT INTO $db_table (id, ip) VALUES ('$maxid', '$my_ip')");
---

auto_increment hab ich bei der Tabelle ausgeschalten. Wenn schon Einträge vorhanden sind, schreibt er den nächsten in die Null (0):

id | eintrag
0  | neuer eintrag ohne auto_increment
1  | alter eintrag
2  | alter eintrag
3  | alter eintrag

Wenn nichts in der Tabelle steht, schreibt er auch nichts hinein. Wo liegt jetzt das Problem?

  1. Hallo Philipp,

    mysql_query("SELECT MAX (id) + 1 as maxid FROM $db_table");

    Du Wertest deine Ergenistabelle nicht aus.

    mysql_query("INSERT INTO $db_table (id, ip) VALUES ('$maxid', '$my_ip')");

    Grüße aus Barsinghausen,
    Fabian

    1. Du Wertest deine Ergenistabelle nicht aus.

      Das heißt?

      Andere Frage: Wenn die ID bei mir ein INT(10) ist und er auto_increment bei 99 angekommen ist, benutzt er dann wieder die IDs, die nicht wieder vergeben wurden? Das würde die ganze Problematik auch wieder lösen! Nicht das MySQL unendlich viele IDs erstellt...*heul*

      1. Hallo Philipp,

        Du Wertest deine Ergenistabelle nicht aus.
        Das heißt?

        Du stellt ein Query, aber weist das Ergebnis keiner Variable zu, die du auch nicht mit mysql_result (oder äquivalenten) Funktionen auswertest. (Wenn du das doch tust, überdenke deine Strategie, hier nur Teilcode zu posten.)

        Andere Frage: Wenn die ID bei mir ein INT(10) ist und er auto_increment bei 99 angekommen ist, benutzt er dann wieder die IDs, die nicht wieder vergeben wurden? Das würde die ganze Problematik auch wieder lösen! Nicht das MySQL unendlich viele IDs erstellt...*heul*

        Überlege, wie groß der Wertebereich einesINT (10) ist.

        Grüße aus Barsinghausen,
        Fabian

        1. Du stellt ein Query, aber weist das Ergebnis keiner Variable zu, die du auch nicht mit mysql_result (oder äquivalenten) Funktionen auswertest. (Wenn du das doch tust, überdenke deine Strategie, hier nur Teilcode zu posten.)

          Reicht das "as maxid" da nicht aus?

          Überlege, wie groß der Wertebereich einesINT (10) ist.

          Ähm, 10 Stellen? Wenn ich jetzt ein INT(2) nehmen würde - was wäre dann? würde MySQL an unbenutzte IDs nehmen?

  2. Moin!

    da es bei PHP/MySQL etwas ungünstig ist, dass nach dem Löschen von Einträgen Lücken bei den IDs entstehen, wollte ich das ganze selbst in die Hand nehmen.

    Das willst du lieber nicht tun.

    Die ID ist nicht zum Sortieren da, und sie ist auch nicht konstruiert, um fortlaufend und ohne Lücken zu entstehen oder dies später zu sein.

    Sie dient dazu, beim Anlegen und bei späteren Zugriffen auf den Datensatz diesen EINDEUTIG zu identifizieren.

    Das Problem bei deinem Ersatzcode: Er ist nicht mehrbenutzertauglich. Wenn zwei Prozesse gleichzeitig einen neuen Datensatz anlegen wollen, kann es sein, dass sie nacheinander jeweils erst die erste Datenbankabfrage ausführen, und dann die zweite. Bei der ersten Abfrage erhalten beide die Information, dass die maximale ID z.B. 23 ist, sie also mit ID 24 weitermachen können. Wenn man aber zwei Datensätze mit ID 24 einfügt, gibt das Müll. Es wird zwar kein Datensatz vom anderen überschrieben, aber die Dopplung haut dir die DB mit Sicherheit durcheinander.


    mysql_query("SELECT MAX (id) + 1 as maxid FROM $db_table");

    mysql_query("INSERT INTO $db_table (id, ip) VALUES ('$maxid', '$my_ip')");

    Informiere dich über den Sinn und die Wichtigkeit einer eindeutigen ID mit auto_increment:
    http://www.dclp-faq.de/q/q-mysql-auto-increment.html
    http://www.dclp-faq.de/q/q-mysql-inkrement.html
    http://www.dclp-faq.de/q/q-sql-ids.html

    - Sven Rautenberg

    --
    SELFTREFFEN 2003 - http://selftreffen.kuemmi.ch/
    ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
    1. Wenn ich das jetzt richtig verstanden habe, bekomme ich einfach eine Fehlermeldung, wenn der Bereich überläuft?
      Ok, dann hat sich das auch erledigt.
      Danke.