Zahlen erhöhen...
Dirk Skerz
- datenbank
0 Rouven0 bleicher0 Rouven
0 Dirk Skerz0 Rouven0 Dirk Skerz0 Rouven
0 Marian
0 Siechfred0 Jasmin (noreg)
Halli Hallo,
Ich habe in meiner Tabelle ein Feld(Nr.) ist ein int-Wert.
Ich erhöhe diese Zahl nach jedem update oder insert neuer Daten um +1...
Ich lese den letzten Wert aus und erhöhe diesen um 1...
auto-increment geht hier nicht...
was mache ich, wenn diese Eintrag gelöscht wird?
z.B. 1,2,3,4,5,6
Ich lösche den Eintrag mit der Zahl 4, nun liest meine Prog. die höhste Zahl aus und erhöht diese um 1.
Wie mache ich es, das ich auch nicht mehr benutzte Zahlen wieder verwenden kann? DANKE
Hi,
kommt drauf an: Ist die Konstanz einer Zahl über die Lebenszeit von Bedeutung? Wenn nein, dann lösche nicht nur die alte Zahl, sondern dekrementiere alle höheren um 1, so bleibt keine Lücke.
Muss die einmal vergebene Zahl konstant bleiben, dann wird's hässlich. Dann bleibt dir aus meiner Sicht nichts anderes übrig als eine Lücke in den Zahlen von Hand zu suchen.
MfG
Rouven
wäre mysql_num_rows+1 nicht auch eine möglichkeit wenn Lücken bedeutunglos sind???
Hi,
wäre mysql_num_rows+1 nicht auch eine möglichkeit wenn Lücken bedeutunglos sind???
1,2,4
Was ergibt deine Abfrage als nächsten Wert? 3+1 = 4, also eine Zahl die schon vergeben ist.
MfG
Rouven
Die Zahl muss konstant bleiben, diese dient einer einmaligen Zuordnung,
nur wenn die Beziehung gelöscht wird. Kann diese Zahl wieder freigegeben werden.
Muss die einmal vergebene Zahl konstant bleiben, dann wird's hässlich. Dann bleibt dir aus meiner Sicht nichts anderes übrig als eine Lücke in den Zahlen von Hand zu suchen.
MfG
Rouven
Hi,
das ist "ärgerlich" - dann bleibt dir nur Skript- oder StoredProcedure-Logik um eine Lücke in den Daten zu suchen.
Man könnte auch noch folgendes machen: Neben der Datentabelle führt man eine "gelöschte Zahlen"-Tabelle. Sucht man nun einen neuen Wert, schlägt man zunächst in der gelöschte-Zahlen-Tabelle nach ob man dort eine findet. Wenn ja, nimm die. Wenn nein, erzeuge über MAX+1 eine neue. Die Frage in beiden Fälle ist, ist die Vermeidung von Lücken wirklich so einen Aufwand wert?
MfG
Rouven
Gute Idee, ist mir auch schonmal in den Sinn gekommen...
Was hälst du davon,
ich erstelle eine Schleife, die von 1 fortlaufend jede Zahl prüft ob vorhanden ist, wenn nicht bzw. Lücke, nimm diese Zahl.
wäre diese variante gut oder zu intensiv?
Hi,
das ist "ärgerlich" - dann bleibt dir nur Skript- oder StoredProcedure-Logik um eine Lücke in den Daten zu suchen.
Man könnte auch noch folgendes machen: Neben der Datentabelle führt man eine "gelöschte Zahlen"-Tabelle. Sucht man nun einen neuen Wert, schlägt man zunächst in der gelöschte-Zahlen-Tabelle nach ob man dort eine findet. Wenn ja, nimm die. Wenn nein, erzeuge über MAX+1 eine neue. Die Frage in beiden Fälle ist, ist die Vermeidung von Lücken wirklich so einen Aufwand wert?MfG
Rouven
Hi,
funktioniert, aber von all den Lösungen finde ich Siechfrieds Vorschlag bisher am effizientesten. Eine Lücke zu suchen ist je nach Datensatzzahl eine Verschwendung von unglaublichen Ressourcen. Bedenke, dass du bei 1 Mio Datensätzen 1 Million Abfragen brauchst um überhaupt festzustellen, dass da eine Lücke ist. Ja, man kann das Beschleunigen falls keine Lücke da sein (MAX(zahl) = COUNT(datensätze)), aber falls dem nicht so ist musst du die Lücke dann immer noch suchen gehen, im Schnitt dürften das dann 500.000 Suchabfragen sein.
MfG
Rouven
Hallo Dirk,
Muss die einmal vergebene Zahl konstant bleiben, dann wird's hässlich. Dann bleibt dir aus meiner Sicht nichts anderes übrig als eine Lücke in den Zahlen von Hand zu suchen.
Die Zahl muss konstant bleiben, diese dient einer einmaligen Zuordnung, nur wenn die Beziehung gelöscht wird. Kann diese Zahl wieder freigegeben werden.
Bist du dir sicher, dass du das wirklich willst? Folgendes Szenario:
* Benutzer 25 will mit Benutzer Nummer 37 irgendwas machen (sagen wir mal ihm 'ne E-Mail schreiben
oder so). Er fängt an zu tippen.
* Benutzer 37 meldet sich ab.
* Ein neuer Benutzer meldet sich an, er erhält die Nummer 37, die ja nun frei ist.
* Benutzer 25 sendet die E-Mail ab (in dem Forumular war in nem hidden-field die ID gespeichert),
der _neue_ Benutzer 24 kriegt die Mail.
Das ist jetzt noch die harmlosere Variante (stell dir z.B. vor, du willst Benutzer 37 "löschen", weil er dauernd getrollt hat. Du vergisst es aber, denkst dann nach ein paar Stunden wieder dran...)
Eine ID muss eindeutig sein. Für immer. Wenn es dir nur ums Aussehen geht, kannst du (z.B. du willst 'ne Liste mit allen Benutzern ausgeben) bei der Ausgabe fortlaufende Nummern machen (oder <ol>).
Oder mach keine Nummern als ID, sondern z.B. "dirk.skerz", "marian.sigler" oder so.
(Siehe auch dieses und dieses (v.a. 2. und 3.) Posting)
Viele Grüße aus Freiburg,
Marian
Hell-O!
Ich lösche den Eintrag mit der Zahl 4, nun liest meine Prog. die höhste Zahl aus und erhöht diese um 1. Wie mache ich es, das ich auch nicht mehr benutzte Zahlen wieder verwenden kann?
Lösche die Datensätze nicht physisch, sondern setze ein entsprechendes Flag "gelöscht". Dann hole dir vor einem INSERT alle Einträge, die als "gelöscht" markiert wurden und überschreibe den mit der kleinsten ID. Natürlich musst du deine SELECT-Abfragen dann noch dahingehend verändern, dass dir nur Datensätze ausgegeben werden, die nicht als gelöscht markiert wurden. Sinnvoll ist diese Vorgehensweise aber nur, wenn der ID keine historische Bedeutung zukommt.
Siechfred
Halli Hallo,
Hallo.
Ich habe in meiner Tabelle ein Feld(Nr.) ist ein int-Wert.
Ich erhöhe diese Zahl nach jedem update oder insert neuer Daten um +1...
Ich lese den letzten Wert aus und erhöhe diesen um 1...
auto-increment geht hier nicht...
Vielen Anfängern (ich weiß nicht ob du einer bist) missfällt, dass Einträge in Datenbanken nicht von "oben nach unten" durchnummeriert werden und dass Lücken entstehen, wenn Datensätze gelöscht werden. Dies ist aber richtig so und ist wichtig um einen Datensatz eindeutig zu identifiezieren. Marian hat dir schon erklärt warum.
In einer Datenbank gibt es keine feste Reihenfolge der Datensätze. Willst du eine erzwingen nutze ORDER BY
bei einer Abfrage. Diese Datensätze kannst du dann noch in deinem Skript durchnummerieren.
Grüße
Jasmin