Jan: MySQL: Nächsten Auto-Increment-Wert herausfinden

Hallo Leute!

Wie kann ich auf eine sichere Art und Weise den nächsten Wert eines Auto-Increment-Feldes herausfinden?

Bisher hab ich es immer so gemacht, dass den letzten Eintrag herausgelesen hab und dann einfach 1 dazugezählt.
Doch teste grad an einem Script herum und habe den letzten Eintrag gelöscht (mit ID 27), und bei einem weiteren Eintrag setzt er eben dort an, wo er war (ID 28).

Wie kann ich das umgehen?

lg, Jan

  1. Hi,

    Wie kann ich auf eine sichere Art und Weise den nächsten Wert eines Auto-Increment-Feldes herausfinden?
    Bisher hab ich es immer so gemacht, dass den letzten Eintrag herausgelesen hab und dann einfach 1 dazugezählt.
    Doch teste grad an einem Script herum und habe den letzten Eintrag gelöscht (mit ID 27), und bei einem weiteren Eintrag setzt er eben dort an, wo er war (ID 28).
    Wie kann ich das umgehen?

    Warum willst Du das umgehen?
    Eine Id in einem Datensatz (Tabellenzeile oder wie auch immer man das nennen will) dient üblicherweise ausschließlich dazu, diesen einen Datensatz eindeutig zu identifizieren. Welchen konkreten Wert die Id dabei hat, ist vollkommen unerheblich, solange er eindeutig ist.

    cu,
    Andreas

    --
    MudGuard? Siehe http://www.Mud-Guard.de/
  2. Halihallo Jan

    Wie kann ich auf eine sichere Art und Weise den nächsten Wert eines Auto-Increment-Feldes herausfinden?

    Ohne Umstände gar nicht.

    Bisher hab ich es immer so gemacht, dass den letzten Eintrag herausgelesen hab und dann einfach 1 dazugezählt.

    Huch, was passiert, wenn zwischen SELECT und INSERT ein anderer
    Datensatz eingefügt wurde? - Vergiss diese Lösung sehr schnell!

    Doch teste grad an einem Script herum und habe den letzten Eintrag gelöscht (mit ID 27), und bei einem weiteren Eintrag setzt er eben dort an, wo er war (ID 28).

    Das ist auch richtig so. Falls ein Datensatz mit 27 irgendwo
    referenziert wird, dann jedoch gelöscht wird und ein neuer Eintrag
    (der nichts mit dem alten zu tun hat) an der "Stelle" 27 eingesetzt
    werden würde, so wären zwei völlig Inhaltsfremde Datensätze
    miteinander verknüpft. Um diesen groben Fehler auszuschliessen, wird
    auch bei DELETE der Next_Autoincrement nicht um eins dekrementiert.

    http://www.mysql.com/doc/en/SHOW_TABLE_STATUS.html
    "Auto_increment".

    Merke aber, dass auch das Auslesen dieses Wertes *nicht* der nächste
    Autoincrement sein muss. Um sicherzugehen, musst du die Tabelle
    umbedingt mit einem Schreib-LOCK versehen.

    Allgemein sehe ich den Sinn deiner Aktion nicht. Warum versuchst du
    den nächsten Wert zu erraten? - Er wird ja automatisch generiert und
    das ist richtig. Um die zuletzt eingefügte ID zu finden gibt es in
    allen DBI's Möglichkeiten, suche nach last_insert_id /
    last_inserted_id, ... und lies die Doku deiner
    Datenbankschnittstelle.

    Viele Grüsse

    Philipp

  3. Mir geht es darum:

    Ich habe ein kleines CMS, bei dem ich während des Erstellens der Seite bereits deren ID für die Zuordnung von Bildern benötige.

    Wenn ich es mit "Letztem Satz + 1" mache, klappt es sicher in 99% der Fälle, aber was ist wenn ich gerade diesen letzten Datensatz lösche?

    Sagen wir ich lösche den letzten Satz mit der ID 27, dann hat der nächste Eintrag trotzdem die ID 28, aber meine Bilderzuordnung würde auf ID 27 laufen, da ich ja den letzten Eintrag (jetzt mit ID 26) auslese und 1 dazuzähle.

    In dem Fall hab ich dann eine falsche Zuordnung, da die Seite auf 28 läuft, und die Bilder alle auf 27, einer Seite die es gar nicht mehr gibt.

    lg, Jan

    1. Mir geht es darum:

      Ich habe ein kleines CMS, bei dem ich während des Erstellens der Seite bereits deren ID für die Zuordnung von Bildern benötige.

      Du hast einen logischen Fehler drin:
      Du mußt die Bilder auf eine andere Art und Weise zuordnen.
      Was hindert Dich daran die ID beim zuordnen der Bilder auszulesen?
      Oder warum ordnest Du die Bilder ID nicht den Artikeln zu?
      Dafür würdest Du vermutlich eine neue Tabelle benötigen.

      TomIRL

    2. Hi,

      Ich habe ein kleines CMS, bei dem ich während des Erstellens der Seite bereits deren ID für die Zuordnung von Bildern benötige.

      Wenn ich es mit "Letztem Satz + 1" mache, klappt es sicher in 99% der Fälle, aber was ist wenn ich gerade diesen letzten Datensatz lösche?

      Was hindert Dich daran, den Datensatz anzulegen mit noch leeren Inhalten - dann steht die ID fest.
      Diese kannst Du auslesen und für die Bildreferenzierungen verwenden.

      Und das eigentliche Abspeichern des Eintrags ist dann eben ein Update statt eines Insert.

      cu,
      Andreas

      --
      MudGuard? Siehe http://www.Mud-Guard.de/
      1. Moin!

        Was hindert Dich daran, den Datensatz anzulegen mit noch leeren Inhalten - dann steht die ID fest.
        Diese kannst Du auslesen und für die Bildreferenzierungen verwenden.

        Und das eigentliche Abspeichern des Eintrags ist dann eben ein Update statt eines Insert.

        Geht sogar noch einfacher: mysql_insert_id() in PHP und anderen Sprachen bzw. SELECT LAST_INSERT_ID() in MySQL liefert genau das zurück.

        Denn das Problem ist: Was passiert, wenn zwei leere Datensätze gleichzeitig von verschiedenen Benutzern angelegt werden? Wie erkennt man die, um deren ID wieder auszulesen? ...

        - Sven Rautenberg

        --
        "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)