tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
934
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Blattspinat
    Blattspinat Blattspinat ist offline Mitglied Gold
    Registriert seit
    Jan 2003
    Ort
    Frankfurt am Main
    Beiträge
    141
    Folgendes:

    ich hab in meiner MySQL DB eine Tabelle in dem mehrere Felder sind. Es interessiert nur das erste: ID . Es erhöht pro Eintrag den Wert per Auto_Increment um 1! Wenn man allerdings z.B. die 6. Zeile aus der Tabelle löscht, dann sieht das so aus 4 , 5 , 7 , 8 , ...! Die 6 also fehlt. wenn ich aber jetzt ein Script habe, bei dem die IDs immer fortlaufend sein müssen, dann hab ich n Problem! Ich wollte eigentlich wissen, welche einstellungen man an der DB vornehmen muss, damit er, wenn ich z.B. die 6 lösche, er alle IDs eins runter setzt, damit kein "Loch" entsteht... HHIILLFFEE

    Danke schomma für die Hilfe

    mfg
    Freddy
     

  2. #2
    Registriert seit
    Jul 2002
    Ort
    Frankfurt (Hessen)
    Beiträge
    2.135
    ist nicht einstellbar da muss man per "hand" nacharbeiten

    $loesche = 6;

    $erg = mysql_query("delete from tab where id='$loesche'");

    $erg = mysql_query("update tab set id=id-1 where id > '$loesche'");
     

  3. #3
    Avatar von Blattspinat
    Blattspinat Blattspinat ist offline Mitglied Gold
    Registriert seit
    Jan 2003
    Ort
    Frankfurt am Main
    Beiträge
    141
    ok logisch danke!
     

  4. #4
    theTC theTC ist offline Grünschnabel
    Registriert seit
    Feb 2003
    Beiträge
    3
    das wird aber doch extrem problematisch, wenn mehrere User die DB benutzen... wenn jetzt z.B. user 1 seine Nachrichten anzeigen lässt, welche er ja für alle Operationen (delete, move, ...) per Id-Link-ansprechen kann, und dann während er sich die seite anschaut user 2 eine seiner Nachrichten löscht... (und somit den genannten Befehl an die DB schickt) dann hat user 1 die falschen Id-Links... .

    Versteht ihr, was ich mein? Es wäre doch bei dieser Problematik sinnvoller, ein Programm/ eine methode zu schreiben, die aufräumt, während wenige/keine User on sind... . Oder ist etwas anderes besser? Ich seh imMo nix .... .
     

  5. #5
    Avatar von Blattspinat
    Blattspinat Blattspinat ist offline Mitglied Gold
    Registriert seit
    Jan 2003
    Ort
    Frankfurt am Main
    Beiträge
    141
    Also deine idee ist sicher Sinnvoll, allerdings nicht wirklich für das Script, was ich geschrieben hab.

    danke trotzdem
     

  6. #6
    Avatar von cobraone
    cobraone cobraone ist offline Mitglied Bronze
    Registriert seit
    Jan 2003
    Beiträge
    47
    Ich habs mal ausprobiert und es hat soweit so gut geklappt. Doch wenn ich nun einen weiteren Eintrag in die DB mache, wird der automatisch, vom ursprünglichen Wert aus, weitergezählt.

    Das war jetzt kompliziert. Hier ein Beispiel:

    Ich habe 4 Einträge
    1....
    2....
    3....
    4....
    5....

    jetzt lösche ich die 4 und 5.
    --> sind also noch die Einträge 1-3.

    Wenn das Script jetzt aber einen Eintrag (per auto_increment) dazufügt, passiert folgendes:
    1....
    2....
    3....
    6.... --> die 4 und 5, die Gelöscht wurden, werden weiter übersprungen******

    Wie kann ich das beheben****?

    Danke für eure Antworten!
     

  7. #7
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.806
    Blog-Einträge
    5
    Ich würd sagen ihr packt das Problem von der falschen Seite her an... passt euer Script an die Datenbank an, nicht andersherum... mir fällt jetzt kein Beispiel ein, bei dem es mit "Lücken" bei den IDs Probleme geben sollte.
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  8. #8
    Avatar von cobraone
    cobraone cobraone ist offline Mitglied Bronze
    Registriert seit
    Jan 2003
    Beiträge
    47
    Es geht mir eigentlich nicht um das Script. In erster Linie möchte ich die DB in möglichst "sauberen" zustand halten. Bei 500 Einträgen am Tag wovon 300 wieder gelöscht werden, jagt das die ID schon ziemlich in die höhe.

    Ich weiss nicht vielleicht ist das ja auch egal? Ich denke mir nur, dass man auf diese Weise die DB auch ein bisschen schlanker und damit die Perform. ein bisschen höher halten könnte.

    Oder liege ich da falsch? Ich weiss es wirklich nicht.

    Obwohl ich schon einige Zeit MySQL in verbindung mit PHP nutze muss ich immer wieder sagen, dass ich eben doch noch ein blutiger Anfänger bin.

    Da bin ich froh euch hier zu haben****** Big thanx******

    ------------
    --- edit ---

    Eine Möglichkeit wüsste ich nun doch. Ist jedoch zu aufwendig.

    Zuerst die ganzen ID's "manuell" ordnen, wie oben schon erwähnt.
    Dann könnte man die ganze DB mitten in der Nacht (oder so) zwischenspeichern, dann die Tabelle "droppen" und anschliessend Create mit den zwischengespeicherten Werten. Dass würde die 'auto_increment' Funktion auch reseten und in den gewünschten ID weitermachen...
    Ich denke aber, dass diese Art, bei grösseren DB's, ziemlich an der Performance zerrt - oder?
    Geändert von cobraone (17.06.03 um 10:34 Uhr)
     

  9. #9
    Avatar von Thomas Pinske
    Thomas Pinske Thomas Pinske ist offline Mitglied Silber
    Registriert seit
    Jun 2003
    Ort
    Bingen (RLP)
    Beiträge
    56
    Hallo,

    Mit einer UNSIGNED BIGINT Spalte kann man ca. 1,8e+18 Zahlenwerte speichern. Bei 500 neuen Datensätzen pro Tag entspricht dies ca. der Menge von 3,6e+15 Tagen oder 100 Billionen Jahren!

    Ich denke das reicht aus, um das Feld nicht zum überlaufen zu bringen.

    Sind mit der ID Spalte noch Spalten in anderen Tabellen verknüpft? Dann müsste man beim manuellen Änderen der ID-Werte auch die entsprechenden Werte in den anderen Tabellen ändern!

    Mein Vorschlag:
    Die ID Spalte als auto_increment lassen wie sie ist, eventuell den Datentyp ändern, damit mehr Werte gespeichert werden können. Zusätzlich dazu eine zweite Spalte anlegen (z.B. SORT), in der du die Werte manuell in richtiger Reihenfolge einträgst. Beim Einfügen eines neuen Datensatz muss vorher der nächste Wert ermittelt werden (MAX(SORT)+1). Beim Löschen eines Datensatzes entsprechend alle folgenden Werte um 1 verkleinert werden.

    Die ID Spalte als PRIMARY KEY anlegen. Dann kannst du die Werte in der SORT Spalte ändern, ohne dass irgendwelche Verknüpfungen davon betroffen sind. Da der Primärschlüssel in einem Index verwaltet wird, spielt die Performance keine Rolle.

    Grüße Thomas
     

  10. #10
    Avatar von Blattspinat
    Blattspinat Blattspinat ist offline Mitglied Gold
    Registriert seit
    Jan 2003
    Ort
    Frankfurt am Main
    Beiträge
    141
    schreibe die id's einfach nicht püer auto_increment in die datenbank sondern rufe vorher ab, wie viele Zeilen du in der Datenbank hast ( mysql_num_rows(); ). dann haste automatisch den wert der höchsten id. diesen wert setze einfach +1 also $neu = $ausgabe[id] + 1 und inserst den in ne neue Zeile. wenn du jetzt einen datensatz löschst, musst du mit dem script nur noch alle IDs, die größer sind als die id, die du gelöscht hast, eines runter setzen. also:

    PHP-Code:
    UPDATE $tabelle SET * -1 WHERE id $ausgabe[id
    also di ids mit dem script generieren! und dann eben kein auto increment verwenden!
     

Ähnliche Themen

  1. Antworten: 13
    Letzter Beitrag: 20.10.08, 22:26
  2. Dateinamen rekursiv fortlaufend nummerieren
    Von dochamburg im Forum PHP
    Antworten: 4
    Letzter Beitrag: 03.12.07, 17:11
  3. Antworten: 4
    Letzter Beitrag: 16.08.07, 12:37
  4. Fortlaufend nummerierte Labels ansprechen
    Von NeMeSiS1987 im Forum Visual Basic 6.0
    Antworten: 5
    Letzter Beitrag: 19.04.07, 11:14
  5. Webserver LogFiles automatisch packen und fortlaufend benennen
    Von madmax2600 im Forum Hosting & Webserver
    Antworten: 2
    Letzter Beitrag: 21.07.03, 15:11