Sandmann: Auto Increment

Hi

Wenn ich bei meinem Datenfeld "id" in der Datenbank Auto Incement eingestellt haben erhöht der das ja immer um 1.
lösche ich also den letzten Datensatz komplett, der vorher die ID hatte 4 dann ist nun die letzte anzeigbare ID 3. versteht ihr was ich meine? wenn ich aber jetzt einen neuen Datensatz anfüge MÜSSTE theoretisch doch der Datensatz den nächst freien nehmen, also wieder 4.

tut er aber nicht, er nimmt 5.
und wen ich mittendrin was lösche würre ich wollen das die ID'S alle ein nachrücken.

Ist das möglich?!

Gruß,
Sandmann

(schon wieder)

  1. tut er aber nicht, er nimmt 5.
    und wen ich mittendrin was lösche würre ich wollen das die ID'S alle ein nachrücken.

    Ist das möglich?!

    So weit ich weiß nicht, nur wenn die DB komplett geleert wird geht´s wieder von vorne los .

    1. So weit ich weiß nicht, nur wenn die DB komplett geleert wird geht´s wieder von vorne los .

      Ja aber es gibt doch sicher eine programmierteschnche Lösung oder?

      1. Hallo Sandmann,

        Ja aber es gibt doch sicher eine programmierteschnche Lösung oder?

        Eine Lösung sollte es geben, aber ob die praktikabel ist, würde ich bezeifeln. Wenn Du einen Datensatz löscht und z.B. 60 Datensätze eine höhere ID haben, dann müsstest Du alle Datensätze aus anderen Tabellen, die auf diese DS zeigen mit ändern und das geht bei entsprechenden Datenmengen extrem auf die Performance. Ich sehe eigentlich keinen Grund für eine solche Lösung, kenne aber Dein Problem nicht.

        Gruß Frank

      2. Du kannst in das auto_increment Feld direkt hinenschreiben.
        Aber das scheint mir ein großer Aufwand, da nach jeder Löschung
        eines Eitrags die gesamte DB abgefragt werden müsste, um die Nummern in dem auto_increment Feld auf eine fortlaufende Nummernreihenfolge zu bringen.
        Warum überhaupt?

  2. Moin Sandmann,
    der Sinn von Autoincrement ist ja gerade, daß Datensätze für alle Zeiten eine eindeutige ID haben. Nehmen wir mal an, du hast eine Tabelle Personen mit den Feldern personenId, nachname, vorname und eine Tabelle Telefon mit den Feldern telId, nummer, personenId, wobei personenId ein Fremdschlüssel aus der Tabelle Personen ist.
    Könnten sich die personenID des in der Tabelle Personen ständig ändern, würde ja die Zuordnung Person/Telefonnummer nicht mehr stimmen.
    Die Frage wäre dann, warum du möchtest, dass immer alle Zahlen belegt sind. Wahrscheinlich brauchst du für dein Problem einen anderen Lösungsansatz.
    Liebe Grüße, Uschi

  3. Hallo,

    Der einzige Zweck einer ID in einer Tabelle sollte die eindeutige Identifizierung eiens Datensatzes sein. Reihungen usw. sollten damit nicht gemacht werden. Es ist dabei unerheblich, ob es Lücken in der Nummerierung gibt oder nicht. Wenn ein Datensatz gelöscht wird ist es sogar ziemlich nützlich, wenn desen ID nicht wieder verwendet wird, um zu verhindern, daß es zu Fehlinterpretationen kommt.
    Stell' Dir z.B. vor, jemand hat einen Link auf die Darstellung eines Datensatz mit der ID 4 gesetzt (Bookmark). Du hast nun keinen Einfluß darauf, daß dieser Link auch gelöscht bzw. modifiziert wird, da Du von dessen Existenz nichts weißt. Wenn nun dieser Datensatz angezeigt werden soll, und er ist gelöscht, so kann das System mit 'not found' oder so ähnlich reagieren. Würdest Du aber eine Neunummerierung durchführen, so kann Dein Sytsem nicht mehr erkennen, ob nun der alte oder der neue Datensatz mit der ID 4 gemeint ist, womit die Eindeutigkeit nicht mehr gegeben ist.[1]

    und wen ich mittendrin was lösche würre ich wollen das die ID'S alle ein nachrücken.
    Ist das möglich?!

    Mit entsprechendem Aufwand, ja, aber ich denke daß Du das eigentlich nicht wirklich willst.

    Grüße
      Klaus

    [1] alte ID's nicht mehr wiederzuverwenden ist übrigens nichts, was es erst seit dem Einsatz von elektronischen Datenbanken gibt. Schon früher wurde es als gut erachtet, Identnummern, z.B. von Maschinenteilen, nicht mer wiederzuverwenden, auch wenn dieses Teile nicht mehr produziert wurde.

  4. Also mein problem ist folgendes:

    ich habe eine Linkliste prgrammiert. jeder Link hat eben (neben der beschreibung name usw.) eine ID
    lösche ich einen Link, dann fehlt der Datensatz und damit eine zahl.
    da sist nicht schön finde ich ;)

    also reine kosmetische Sache

    1. Hallo,

      Also mein problem ist folgendes:

      ich habe eine Linkliste prgrammiert. jeder Link hat eben (neben der beschreibung name usw.) eine ID
      lösche ich einen Link, dann fehlt der Datensatz und damit eine zahl.
      da sist nicht schön finde ich ;)

      Mal angenommen, es handelt sich um eine allein stehende Tabelle mit nur wenigen Datensaetzen, dann waere das machbar:

      DELETE FROM tabelle WHERE ID=10
      ALTER TABLE tabelle DROP ID
      ALTER TABLE tabelle ADD ID SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST

      also reine kosmetische Sache

      Nein, das ist keine kosmetische Sache! Beachte unbedingt die anderen Antworten und lege besser ein weiteres numerisches Feld fuer diesen Zweck an und lasse den auto_increment-Wert in Ruhe.

      MfG, Thomas

    2. Tach,

      ich habe eine Linkliste prgrammiert. jeder Link hat eben (neben der beschreibung name usw.) eine ID

      Eine ID ist aber eben etwas anderes als eine fortlaufende Nummer.
      Wenn Du fortlaufende Nummern anzeigen willst, zähle doch einfach bei der Ausgabe der Datensätze mit und gib jeweils den Zählerstand mit aus.

      Andreas

    3. Aloha!

      ich habe eine Linkliste prgrammiert. jeder Link hat eben (neben der beschreibung name usw.) eine ID
      lösche ich einen Link, dann fehlt der Datensatz und damit eine zahl.
      da sist nicht schön finde ich ;)

      Wenn du nur fortlaufende Zahlen ausgeben willst (erster Link, zweiter Link, dritter Link...), dann lass einfach einen Zähler im Programm (nicht der Datenbank) mitlaufen und gib den jeweils an der entsprechenden Stelle aus.

      In PHP z.B. so:

      $counter = 0;
      while ($zeile = mysql_fetch_array($dbresult))
      {
        $counter += 1;
        echo "$counter. Link: ".$zeile['linktext']."<br>";
      }

      Ergibt eine schöne Liste von Links:
      1. Link: SelfHTML
      2. Link: Selfforum
      3. Link: W3C
      ...
      10. Link: HTML-Validator
      11. Link: CSS-Validator

      also reine kosmetische Sache

      Kosmetische Sachen sind _immer_ Sache des umgebenden, die Datenbank abfragenden Codes. Schließlich ist ja auch die Aufbereitung der Linkliste Sache des abfragenden Codes, und nicht Sache der Datenbank.

      - Sven Rautenberg