Stefan Kleeschulte: MySQL: Kleinstmögliche "unique" Nummer finden

Hi zusammen!

Ich bin noch relativ neu auf dem Gebiet der Datenbanken und habe eine Frage zu MySQL:
Ich habe eine Tabelle mit einer Spalte namens "ID". In dieser Spalte weise ich jeder Zeile eine eigene Nummer zu (Unique). Mit einem PHP-Script kann ich Zeilen aus dieser Tabelle löschen und neue hinzufügen.

Angenommen ich habe 5 Zeilen mit den ID's 1-5. Jetzt lösche ich die 3. und die 5. Zeile und habe nur noch die ID's 1, 2 und 4. Wenn ich jetzt nacheinander drei weitere Zeilen in die Tabelle einfüge, wie bekomme ich am leichtesten raus, welche ID's (3, 5 und 6) noch frei sind? Kann ich MySQL das irgendwie machen lassen? Mit AUTO_INCREMENT zählt MySQL ja bloß immer vom höchstwertigen Feld aus um 1 weiter...

CU :-)
Stefan

  1. Hi zusammen!

    Ich bin noch relativ neu auf dem Gebiet der Datenbanken und habe eine Frage zu MySQL:
    Ich habe eine Tabelle mit einer Spalte namens "ID". In dieser Spalte weise ich jeder Zeile eine eigene Nummer zu (Unique). Mit einem PHP-Script kann ich Zeilen aus dieser Tabelle löschen und neue hinzufügen.

    Angenommen ich habe 5 Zeilen mit den ID's 1-5. Jetzt lösche ich die 3. und die 5. Zeile und habe nur noch die ID's 1, 2 und 4. Wenn ich jetzt nacheinander drei weitere Zeilen in die Tabelle einfüge, wie bekomme ich am leichtesten raus, welche ID's (3, 5 und 6) noch frei sind? Kann ich MySQL das irgendwie machen lassen? Mit AUTO_INCREMENT zählt MySQL ja bloß immer vom höchstwertigen Feld aus um 1 weiter...

    ...und das ist auch gut so. ;) Jedenfalls für die meisten Anwendungsfälle.

    Die ID soll eindeutig sein, und das ist sie ja auch. Wenn du nach ID sortieren läßt, erhälst du nacheinander alle vorhandenen Datensätze, mit eventuellen Lücken in den IDs. Macht aber nichts, denn du könntest ja einen Zähler mitlaufen lassen, um z.B. eine Tabelle mit laufender Nummer zu versehen.

    Deine ID sollte genauso erzeugt werden, wie sie bislang erzeugt wird - es sei denn, du hast einen sehr besonderen Anwendungsfall. Den müßtest du dann aber nochmal genauer schildern. :)

    - Sven Rautenberg

    1. Sup!

      Stell' Dir vor, Du vergibst in der Tat die freiwerdenden IDs erneut - wenn dann eine andere Tabelle die gelöschten Datensätze referenziert (z.B. gab es einen Mitarbeiter mit ID 3, der war Sekretär vom Mitarbeiter mit ID 4), dann kommt nur noch Scheisse raus statt einem Fehler (wenn z.B. der neue Geschäftsführer die ID 3 bekommt... dann ist er plötzlich der Sekretär von Mitarbeiter 4, falls jemand vergessen hat, alle Referenzen auf die ID 3 zu löschen)

      Grüsse,

      Bio)

      1. Stell' Dir vor, Du vergibst in der Tat die freiwerdenden IDs erneut - wenn dann eine andere Tabelle die gelöschten Datensätze referenziert (z.B. gab es einen Mitarbeiter mit ID 3, der war Sekretär vom Mitarbeiter mit ID 4), dann kommt nur noch Scheisse raus statt einem Fehler (wenn z.B. der neue Geschäftsführer die ID 3 bekommt... dann ist er plötzlich der Sekretär von Mitarbeiter 4, falls jemand vergessen hat, alle Referenzen auf die ID 3 zu löschen)

        In meinem Fall wäre eine falsche Referenz nicht so schlimm. Ich denke nur, wenn ich oft Datensätze lösche und hinzufüge, dann wird die ID ja immer größer...

        Naja, trotzdem danke!
        CU :-)
        Stefan

        1. In meinem Fall wäre eine falsche Referenz nicht so schlimm. Ich denke nur, wenn ich oft Datensätze lösche und hinzufüge, dann wird die ID ja immer größer...

          Ja, und? Welchen Datentyp hast du für die ID genommen? Vermutlich KEINE 8 Bit (-127 bis +128, bzw. 0 bis 255), sondern eher eine "normale" Variante mit 32 Bit (immerhin 0 bis gut 4 Milliarden).

          Der Speicherplatz ist auch unerheblich, denn es werden IMMER 32 Bit gespeichert, egal ob Null oder Eins.

          -Sven Rautenberg