[MySQL] $id wird vielleicht falsch gesetzt

PunkRatte

Well-known member
17 Februar 2007
134
5
Hi,
habe folgendes Problem bei meinen Gästebuch und meinen Newsscript (funktioniert beides nach den selben schema):

wenn ich ich zum Beispiel 3 News verfasse dann speichert es in $id die
"1" für den ersten beitrag,
"2" für den zweiten beitrag,
"3" für den dritten beitrag.

soweit verständlich, aber...

... wenn ich beitrag nummer 3 lösche, und einen neuen beitrag verfasse dann bekommt der neue beitrag die nummer 4 zugewiesen und es entstehen dadurch lücken und die zahlen in $id sind nicht fortlaufend.


Wie kommt das und wozu dient das?

Doof ist es beim Gästebuch wenn man bei jeden eintrag anzeigen will der wievielte beitrag es ist. Deshalb würde ich das gerne ändern.





Gruß PR
 
Wie kommt das und wozu dient das?
Der nächste Auto_Increment-Wert bleibt dennoch 4, egal, was du löscht.

Für was das dient ? :LOL:
Wäre das nicht so, würden 99% aller Webseiten nicht mehr funktionieren 8O
Doof ist es beim Gästebuch wenn man bei jeden eintrag anzeigen will der wievielte beitrag es ist. Deshalb würde ich das gerne ändern.
Du solltest ja auch nicht die ID ausgeben, sondern einfach beim Ausgeben durchnummerieren.
 
Für was das dient ? :LOL:
Wäre das nicht so, würden 99% aller Webseiten nicht mehr funktionieren 8O

das ist aber eine komische Begründung. Aber nee andere Begründung hab ich etz auch nicht ;). (eigentlich logisch das SQL davon ausgeht das nix gelöscht wird und somit der Wert nur steigt und nicht sinkt)

Also kannst du, wenn einen datensatz löscht, die anderen nachrücken und auto_increment eins runtersetzen (evtl als trigger??) ist aber ARBEIT ;)....

also einfach durchzählen und gut ist....

mfg
Samy
 
Und was würdest du machen, wenn Nr. 3 erst gelöscht würde, nachdem Nummer 4 eingefügt worden wäre? Nachträglich alle IDs ändern?

Auch aus dieser Sicht gibt es nur eine logische Konsequenz: :arrow: Erst bei der Ausgabe nummerieren.
 
Die reihenfolge würde ich lieber durch den timestamp bestimmen, sit einfach eindeutiger und dann beim anzeigen einfach durch die schleife nummerieren...
 
Warum ist das so? Es ist eigentlich ganz einfach: Die ID dient dazu jeden einzelnen Beitrag identifizieren zu können. Deswegen ist die ID einzigartig.

Verlinkt man auf eine Seite z.B. so: https://domain.de/index.php?ID=12 und man löscht nun den Datensatz mit der ID 10. So kann man aber trotzdem weiterhin auf den Link mit der ID 12 zugreifen. Sollte nun alles durch das Löschen immer neu nummeriert werden so ergibt sich einfach das Problem das die bereits verlinkten Beiträge auf einen falschen Beitrag linken.

Die reihenfolge würde ich lieber durch den timestamp bestimmen, sit einfach eindeutiger und dann beim anzeigen einfach durch die schleife nummerieren...

Trotzdem ist der timestamp nicht eindeutig. Wenn jetzt theoretisch zu genauer der gleichen Sekunde zwei Leute gleichzeitig posten dann bekommen zwar beide den gleichen Timestamp aber nicht die gleiche ID.
 
das ist aber eine komische Begründung. Aber nee andere Begründung hab ich etz auch nicht ;).
Sorry, ich war heut Nacht kurz vorm Bettgehen und hatte nicht wirklich Lust, Primär- und Fremdschlüssel zu erklären ;)

Das Problem sind nicht fehlerhafte Links, die entstehen würde, sondern, dass Abhängigkeiten zwischen Tabellen verloren gehen.

Ein praktisches Beispiel, hier im Forum gibt es - vereinfacht - 2 Tabellen. Eine für die Themen ("threads") und eine für die Beiträge ("posts"). Es existiert weiterhin eine 1:n-Beziehung ("Jeder Post ist genau einem Thread zugeordnet, aber ein Thread kann mehrere Posts haben") zwischen den beiden.
Das Layout der Thread-Tabelle sieht so aus:
Code:
[FONT=Courier New][B][COLOR=#9932cc]CREATE[/COLOR][/B] [B][COLOR=#9932cc]TABLE[/COLOR][/B] `threads` (
  `id` [B][COLOR=#9932cc]INT[/COLOR][/B](11) [B][COLOR=#9932cc]NOT[/COLOR][/B] [B][COLOR=#9932cc]NULL[/COLOR][/B] AUTO_INCREMENT,
  `title` [B][COLOR=DarkOrchid]VAR[/COLOR][COLOR=#9932cc][B][COLOR=#9932cc]CHAR[/COLOR][/B][/COLOR][/B][COLOR=#9932cc]([/COLOR]128[COLOR=#9932cc])[/COLOR] [B][COLOR=#9932cc]NOT[/COLOR][/B] [B][COLOR=#9932cc]NULL[/COLOR][/B],
  `icon` [B][COLOR=#9932cc]TINYINT[/COLOR][/B](3) [B][COLOR=#9932cc]NOT[/COLOR][/B] [B][COLOR=#9932cc]NULL[/COLOR][/B],
  [B][COLOR=#9932cc]PRIMARY[/COLOR][/B] [B][COLOR=#9932cc]KEY[/COLOR][/B] (`id`)
) TYPE=MyISAM;[/FONT]
Das Feld `id` ist Primärschlüssel und identifiziert eindeutig den Thread. Die Post-Tabelle sieht so aus:
Code:
[FONT=Courier New][B][COLOR=#9932cc]CREATE[/COLOR][/B] [B][COLOR=#9932cc]TABLE[/COLOR][/B] `posts` (
  `id` [B][COLOR=#9932cc]INT[/COLOR][/B](11) [B][COLOR=#9932cc]NOT[/COLOR][/B] [B][COLOR=#9932cc]NULL[/COLOR][/B] AUTO_INCREMENT,
  `threadid` [B][COLOR=#9932cc]INT[/COLOR][/B](11) [B][COLOR=#9932cc]NOT[/COLOR][/B] [B][COLOR=#9932cc]NULL[/COLOR][/B],
  `text` [B][COLOR=DarkOrchid]TEXT[/COLOR][/B] [B][COLOR=#9932cc]NOT[/COLOR][/B] [B][COLOR=#9932cc]NULL[/COLOR][/B],
  [B][COLOR=#9932cc]PRIMARY[/COLOR][/B] [B][COLOR=#9932cc]KEY[/COLOR][/B] (`id`),
  [B][COLOR=#9932cc]INDEX[/COLOR][/B] [B][COLOR=#9932cc]KEY[/COLOR][/B] (`threadid`),
) TYPE=MyISAM;[/FONT]
Auch hier identifiziert das Feld `id` eindeutig den Post (`id` ist Primärschlüssel). Außerdem identifiziert das Feld `threadid` den zugehörigen Thread der 1:n-Beziehung. `threadid` ist Fremdschlüssel (Primärschlüssel in der Thread-Tabelle).

Nun Beispieldaten:
Thread 1 enthält die Posts 1, 3, 4, 5, 7, 10
Thread 2 enthält die Posts 2, 6, 8, 9, 11.
Danach wären folglich die nächsten Auto_Increment-Werte: Thread 3 und Post 12.
Jetzt lösche ich den Thread 1 zusammen mit den Posts, die darin sind.
Angenommen, der Thread 2 würde zu Thread 1 werden, stimmt der Fremdschlüssel nicht mehr, da Posts 2, 6, 8, 9 und 11 plötzlich keinen Thread mehr haben 8O
Noch schlimmer: Wenn ich dann normal weiternummeriere und Thread 2 (statt korrekterweise Thread 3) erstelle, hat der neuerstellte Thread plötzlich schon 5 Posts, nämlich die Posts 2, 6, 8, 9, 11, die ja zu Thread 2 gehören.
 
Hi,

danke erstmal für die sehr vielen antworten.
Glaube das ganze ist für meinen paar wenigen Grundkentnissen zu hoch für mich :-?
Aber so in etwas versteh ich es warum das so gängig ist.

Gruß PR