fortlaufend IDs vergeben?

Blattspinat

Erfahrenes Mitglied
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
 
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'");
 
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 :D.... .
 
Also deine idee ist sicher Sinnvoll, allerdings nicht wirklich für das Script, was ich geschrieben hab.

danke trotzdem :)
 
Fortlaufende ID

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!
 
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.
 
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?
 
Zuletzt bearbeitet:
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
 
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:
UPDATE $tabelle SET * -1 WHERE id > $ausgabe[id]

also di ids mit dem script generieren! und dann eben kein auto increment verwenden!
 

Neue Beiträge

Zurück