[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
 

theHacker

sieht vor lauter Ads, den Content nicht mehr
Teammitglied
ID: 69505
L
20 April 2006
22.643
1.280
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.
 

Samy

...
2 Mai 2006
572
71
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
 

MrToiz

Well-known member
ID: 72115
L
28 April 2006
766
91
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.
 

NightWalk3r

Well-known member
26 April 2006
45
1
Die reihenfolge würde ich lieber durch den timestamp bestimmen, sit einfach eindeutiger und dann beim anzeigen einfach durch die schleife nummerieren...
 

Mowee

Well-known member
ID: 266520
L
22 Dezember 2006
795
102
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: http://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.
 

theHacker

sieht vor lauter Ads, den Content nicht mehr
Teammitglied
ID: 69505
L
20 April 2006
22.643
1.280
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.
 

PunkRatte

Well-known member
17 Februar 2007
134
5
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
 
Ähnliche Themen
Ersteller Titel Forum Antworten Datum
News-Bot News Lindner: Risiko falsch negativer Corona-Tests verantwortbar News-Diskussionen 0

Ähnliche Themen